Compare commits
46 Commits
release-1.
...
release-1.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3d9c81ffa7 | ||
|
|
9b86ea56ab | ||
|
|
a326307b0d | ||
|
|
2e888a1e68 | ||
|
|
2b1755eb2a | ||
|
|
7f3832a73d | ||
|
|
935de375b9 | ||
|
|
b88ea10937 | ||
|
|
9b29302d42 | ||
|
|
e67d3243e8 | ||
|
|
977dba4be6 | ||
|
|
114d96195b | ||
|
|
99786cdf17 | ||
|
|
0ad7781c8b | ||
|
|
dceba7e2e1 | ||
|
|
3a6b5af494 | ||
|
|
d6ca454bad | ||
|
|
e7581df394 | ||
|
|
65d763b30b | ||
|
|
16798879b9 | ||
|
|
74ce8fc87e | ||
|
|
7dde3423f7 | ||
|
|
4a960a289e | ||
|
|
aad78a92f6 | ||
|
|
edaad3f605 | ||
|
|
6ef317da16 | ||
|
|
4ba084e7d5 | ||
|
|
6732d2e3de | ||
|
|
8e5f0404a8 | ||
|
|
080965f0e5 | ||
|
|
cd9b6ec54e | ||
|
|
e01a87e644 | ||
|
|
e0cba78dac | ||
|
|
22ff0374d5 | ||
|
|
813f52f452 | ||
|
|
2dd376a5b1 | ||
|
|
16832d52c0 | ||
|
|
d128b734b0 | ||
|
|
9a300db87a | ||
|
|
c6698cbf5a | ||
|
|
4c8ecf5459 | ||
|
|
1a2fdc259c | ||
|
|
5c3f2f0aed | ||
|
|
e0ef409220 | ||
|
|
d9199ce836 | ||
|
|
d78a47ad30 |
5
AUTHORS
@@ -17,11 +17,6 @@ Images Authors:
|
|||||||
license: GPLv2
|
license: GPLv2
|
||||||
url: http://ftp.acc.umu.se/pub/GNOME/sources/gnome-icon-theme
|
url: http://ftp.acc.umu.se/pub/GNOME/sources/gnome-icon-theme
|
||||||
|
|
||||||
* files: src/oxygen/*.png
|
|
||||||
copyright: Oxygen Icon Theme (KDE)
|
|
||||||
license: LGPL
|
|
||||||
url: http://www.oxygen-icons.org
|
|
||||||
|
|
||||||
* files: src/Icons/flags/*.png
|
* files: src/Icons/flags/*.png
|
||||||
copyright: Open Clip Art Library
|
copyright: Open Clip Art Library
|
||||||
license: Creative Commons Public Domain Dedication
|
license: Creative Commons Public Domain Dedication
|
||||||
|
|||||||
49
Changelog
@@ -1,52 +1,3 @@
|
|||||||
* Unknown - Christophe Dumez <chris@qbittorrent.org> - v1.5.0
|
|
||||||
- FEATURE: Added Magnet URI support
|
|
||||||
- FEATURE: Search engine supports category-based requests
|
|
||||||
- FEATURE: Make use of torrent enclosure in RSS feeds for direct download
|
|
||||||
- FEATURE: Implemented a RSS feed downloader with filter support
|
|
||||||
- FEATURE: Save old RSS item to hard disk to remember them on start up
|
|
||||||
- FEATURE: Display free disk space in torrent addition dialog
|
|
||||||
- FEATURE: In torrent addition from URL, paste clipboard content if it contains an URL
|
|
||||||
- FEATURE: RSS feeds URLs can now be copied to clipboard
|
|
||||||
- FEATURE: RSS feeds can now be grouped into folders
|
|
||||||
- FEATURE: Added "Unread" item to RSS feed list to display all unread news
|
|
||||||
- FEATURE: If a torrent contains a torrent file, process downloaded torrent file too
|
|
||||||
- FEATURE: A random listening port can be chosen automatically
|
|
||||||
- BUGFIX: torrent resume code rewrited
|
|
||||||
- BUGFIX: Greatly improved column sorting code
|
|
||||||
- BUGFIX: Possibility to create trackerless torrents
|
|
||||||
- BUGFIX: Better item coloring in torrent content filtering dialog
|
|
||||||
- COSMETIC: Redesigned search tab to improve usability
|
|
||||||
- COSMETIC: Redesigned RSS tab to improve usability
|
|
||||||
|
|
||||||
* Sun Aug 21 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.4.1
|
|
||||||
- BUGFIX: Fix problems when changing save path (if using temporary download folder)
|
|
||||||
- BUGFIX: Display real save path instead of the temporary one in torrent properties
|
|
||||||
- BUGFIX: Catching invalid_handle exception to avoid rare crashes
|
|
||||||
- BUGFIX: Fixed popup menu position in RSS feeds list
|
|
||||||
- BUGFIX: Don't save RSS feed state if it could not be updated
|
|
||||||
|
|
||||||
* Thu Aug 13 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.4.0
|
|
||||||
- FEATURE: Display swarm information in lists
|
|
||||||
- FEATURE: Allow to define temporary download folder
|
|
||||||
- FEATURE: Display total amount of uploaded data in finished list
|
|
||||||
- FEATURE: Resizing a column in a search results tab affects all tabs
|
|
||||||
- FEATURE: Search results tab columns are now remembered upon startup
|
|
||||||
- FEATURE: Added right click menu in search engine to clear completion history
|
|
||||||
- FEATURE: Allow to set a different port for DHT (UDP) than the one used for Bittorrent
|
|
||||||
- FEATURE: Updated spoofing code to avoid trackers ban
|
|
||||||
- BUGFIX: Provide more helpful explanation when an I/O error occured
|
|
||||||
- BUGFIX: Stop enforcing UTF-8 and use system locale instead
|
|
||||||
- COSMETIC: Redesigned program preferences
|
|
||||||
- COSMETIC: Updated icons set
|
|
||||||
|
|
||||||
* Fri Jul 24 2009 - Christophe DUMEZ <chris@qbittorrent.org> - 1.3.5
|
|
||||||
- BUGFIX: Made IP filter parser more robust
|
|
||||||
- BUGFIX: Fixed torrent creation tool
|
|
||||||
- BUGFIX: Fixed possible overflow in progress calculation in arborescence.h
|
|
||||||
- BUGFIX: Save properties window size, position, columns width and restore them
|
|
||||||
- BUGFIX: Set a minimum default width for NAME column in properties
|
|
||||||
- BUGFIX: Remember visual indexes of columns in transfer lists
|
|
||||||
|
|
||||||
* Sun Jul 12 2009 - Christophe DUMEZ <chris@qbittorrent.org> - v1.3.4
|
* Sun Jul 12 2009 - Christophe DUMEZ <chris@qbittorrent.org> - v1.3.4
|
||||||
- BUGFIX: Fixed IP filter file parsing on 64bits
|
- BUGFIX: Fixed IP filter file parsing on 64bits
|
||||||
- BUGFIX: Suppressed QLayout: Attempting to add QLayout "" to properties "properties" warning message when opening a properties dialog
|
- BUGFIX: Suppressed QLayout: Attempting to add QLayout "" to properties "properties" warning message when opening a properties dialog
|
||||||
|
|||||||
19
TODO
@@ -1,2 +1,21 @@
|
|||||||
See https://blueprints.launchpad.net/qbittorrent/
|
See https://blueprints.launchpad.net/qbittorrent/
|
||||||
|
|
||||||
|
// translations done in v1.3.0
|
||||||
|
- Romanian
|
||||||
|
- Russian
|
||||||
|
- Hungarian
|
||||||
|
- German
|
||||||
|
- Chinese (traditional)
|
||||||
|
- Chinese (simplified)
|
||||||
|
- Italian
|
||||||
|
- Swedish
|
||||||
|
- Turkish
|
||||||
|
- French
|
||||||
|
- Slovak
|
||||||
|
- Czech
|
||||||
|
- Korean
|
||||||
|
- Portuguese
|
||||||
|
- Brazilian
|
||||||
|
- Greek
|
||||||
|
- Bulgarian
|
||||||
|
- Finnish
|
||||||
|
|||||||
109
configure
vendored
@@ -18,12 +18,17 @@ Main options:
|
|||||||
--help This help text.
|
--help This help text.
|
||||||
|
|
||||||
Dependency options:
|
Dependency options:
|
||||||
--with-libboost-inc=[path] Path to libboost include files
|
--with-libtorrent-inc=[path] Path to libtorrent-rasterbar include
|
||||||
--with-libcurl-inc=[path] Path to libcurl include files
|
files
|
||||||
--with-libcurl-lib=[path] Path to libcurl library files
|
--with-libtorrent-lib=[path] Path to libtorrent-rasterbar library
|
||||||
--disable-libzzip Disable use of libzzip
|
files
|
||||||
--with-libzzip-inc=[path] Path to libzzip++ include files
|
--with-libtorrent-static-lib=[path] Path to libtorrent-rasterbar .a file
|
||||||
--with-libzzip-lib=[path] Path to libzzip++ library files
|
--with-libboost-inc=[path] Path to libboost include files
|
||||||
|
--with-libcurl-inc=[path] Path to libcurl include files
|
||||||
|
--with-libcurl-lib=[path] Path to libcurl library files
|
||||||
|
--disable-libzzip Disable use of libzzip
|
||||||
|
--with-libzzip-inc=[path] Path to libzzip++ include files
|
||||||
|
--with-libzzip-lib=[path] Path to libzzip++ library files
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
}
|
}
|
||||||
@@ -140,6 +145,21 @@ while [ $# -gt 0 ]; do
|
|||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
--with-libtorrent-inc=*)
|
||||||
|
QC_WITH_LIBTORRENT_INC=$optarg
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
|
--with-libtorrent-lib=*)
|
||||||
|
QC_WITH_LIBTORRENT_LIB=$optarg
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
|
--with-libtorrent-static-lib=*)
|
||||||
|
QC_WITH_LIBTORRENT_STATIC_LIB=$optarg
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
|
||||||
--with-libboost-inc=*)
|
--with-libboost-inc=*)
|
||||||
QC_WITH_LIBBOOST_INC=$optarg
|
QC_WITH_LIBBOOST_INC=$optarg
|
||||||
shift
|
shift
|
||||||
@@ -191,6 +211,9 @@ echo PREFIX=$PREFIX
|
|||||||
echo BINDIR=$BINDIR
|
echo BINDIR=$BINDIR
|
||||||
echo DATADIR=$DATADIR
|
echo DATADIR=$DATADIR
|
||||||
echo EX_QTDIR=$EX_QTDIR
|
echo EX_QTDIR=$EX_QTDIR
|
||||||
|
echo QC_WITH_LIBTORRENT_INC=$QC_WITH_LIBTORRENT_INC
|
||||||
|
echo QC_WITH_LIBTORRENT_LIB=$QC_WITH_LIBTORRENT_LIB
|
||||||
|
echo QC_WITH_LIBTORRENT_STATIC_LIB=$QC_WITH_LIBTORRENT_STATIC_LIB
|
||||||
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
|
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
|
||||||
echo QC_WITH_LIBCURL_INC=$QC_WITH_LIBCURL_INC
|
echo QC_WITH_LIBCURL_INC=$QC_WITH_LIBCURL_INC
|
||||||
echo QC_WITH_LIBCURL_LIB=$QC_WITH_LIBCURL_LIB
|
echo QC_WITH_LIBCURL_LIB=$QC_WITH_LIBCURL_LIB
|
||||||
@@ -323,29 +346,70 @@ public:
|
|||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: libtorrent-rasterbar
|
name: libtorrent-rasterbar
|
||||||
|
arg: with-libtorrent-inc=[path], Path to libtorrent-rasterbar include files
|
||||||
|
arg: with-libtorrent-lib=[path], Path to libtorrent-rasterbar library files
|
||||||
|
arg: with-libtorrent-static-lib=[path], Path to libtorrent-rasterbar .a file
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
// see Conf::findPkgConfig
|
|
||||||
class qc_libtorrent_rasterbar : public ConfObj
|
class qc_libtorrent_rasterbar : public ConfObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.14.4 advised)"; }
|
QString name() const { return "libtorrent-rasterbar >= 0.14"; }
|
||||||
QString shortname() const { return "libtorrent-rasterbar"; }
|
QString shortname() const { return "libtorrent-rasterbar"; }
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QStringList incs;
|
QString s;
|
||||||
QString req_ver = "0.14.0";
|
s = conf->getenv("QC_WITH_LIBTORRENT_INC");
|
||||||
QString adv_ver = "0.14.4";
|
if(!s.isEmpty()) {
|
||||||
QString version, libs, other;
|
if(!conf->checkHeader(s, "libtorrent/magnet_uri.hpp")) {
|
||||||
VersionMode mode = VersionMin;
|
return false;
|
||||||
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
|
}
|
||||||
return false;
|
}else{
|
||||||
for(int n = 0; n < incs.count(); ++n)
|
QStringList sl;
|
||||||
conf->addIncludePath(incs[n]);
|
sl << "/usr/include";
|
||||||
if(!libs.isEmpty())
|
sl << "/usr/local/include";
|
||||||
conf->addLib(libs);
|
bool found = false;
|
||||||
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
foreach(s, sl){
|
||||||
printf("\nWarning: libtorrent-rasterbar v%s was detected. Although it will compile and run, you will probably experience some bugs. Please consider updating to v%s!\n", version.toUtf8().data(), adv_ver.toUtf8().data());
|
if(conf->checkHeader(s, "libtorrent/magnet_uri.hpp")){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
conf->addIncludePath(s);
|
||||||
|
conf->addIncludePath(s+QDir::separator()+"libtorrent");
|
||||||
|
|
||||||
|
s = conf->getenv("QC_WITH_LIBTORRENT_STATIC_LIB");
|
||||||
|
if(!s.isEmpty() && QFile::exists(s) && s.endsWith(".a")){
|
||||||
|
conf->addLib(s);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
s = conf->getenv("QC_WITH_LIBTORRENT_LIB");
|
||||||
|
if(!s.isEmpty()) {
|
||||||
|
if(!conf->checkLibrary(s, "torrent-rasterbar")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
conf->addLib(QString("-L") + s);
|
||||||
|
}else{
|
||||||
|
QStringList sl;
|
||||||
|
sl << "/usr/lib/";
|
||||||
|
sl << "/usr/lib64/";
|
||||||
|
sl << "/usr/local/lib/";
|
||||||
|
sl << "/usr/local/lib64/";
|
||||||
|
bool found = false;
|
||||||
|
foreach(s, sl){
|
||||||
|
if(conf->checkLibrary(s, "torrent-rasterbar")){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found) return false;
|
||||||
|
conf->addLib(QString("-L") + s);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -1503,6 +1567,9 @@ export PREFIX
|
|||||||
export BINDIR
|
export BINDIR
|
||||||
export DATADIR
|
export DATADIR
|
||||||
export EX_QTDIR
|
export EX_QTDIR
|
||||||
|
export QC_WITH_LIBTORRENT_INC
|
||||||
|
export QC_WITH_LIBTORRENT_LIB
|
||||||
|
export QC_WITH_LIBTORRENT_STATIC_LIB
|
||||||
export QC_WITH_LIBBOOST_INC
|
export QC_WITH_LIBBOOST_INC
|
||||||
export QC_WITH_LIBCURL_INC
|
export QC_WITH_LIBCURL_INC
|
||||||
export QC_WITH_LIBCURL_LIB
|
export QC_WITH_LIBCURL_LIB
|
||||||
|
|||||||
@@ -64,11 +64,14 @@ public:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
conf->addLib(QString("-L") + s);
|
conf->addLib(QString("-L") + s);
|
||||||
QString out = "";
|
QProcess magickConfig;
|
||||||
QStringList params;
|
QStringList params;
|
||||||
params << "--libs";
|
params << "--libs";
|
||||||
qconf->doCommand("Magick++-config", params, &out);
|
magickConfig.start("Magick++-config", params, QIODevice::ReadOnly);
|
||||||
out = out.replace("\n", "");
|
magickConfig.waitForStarted();
|
||||||
|
magickConfig.waitForFinished();
|
||||||
|
QByteArray result = magickConfig.readAll();
|
||||||
|
result = result.replace("\n", "");
|
||||||
conf->addLib(result.data());
|
conf->addLib(result.data());
|
||||||
conf->addDefine("HAVE_MAGICK");
|
conf->addDefine("HAVE_MAGICK");
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: libtorrent-rasterbar
|
name: libtorrent-rasterbar
|
||||||
|
arg: with-libtorrent-inc=[path], Path to libtorrent-rasterbar include files
|
||||||
|
arg: with-libtorrent-lib=[path], Path to libtorrent-rasterbar library files
|
||||||
|
arg: with-libtorrent-static-lib=[path], Path to libtorrent-rasterbar .a file
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
// see Conf::findPkgConfig
|
// see Conf::findPkgConfig
|
||||||
@@ -8,22 +11,61 @@ class qc_libtorrent_rasterbar : public ConfObj
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.14.4 advised)"; }
|
QString name() const { return "libtorrent-rasterbar >= 0.14"; }
|
||||||
QString shortname() const { return "libtorrent-rasterbar"; }
|
QString shortname() const { return "libtorrent-rasterbar"; }
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QStringList incs;
|
QString s;
|
||||||
QString req_ver = "0.14.0";
|
s = conf->getenv("QC_WITH_LIBTORRENT_INC");
|
||||||
QString adv_ver = "0.14.4";
|
if(!s.isEmpty()) {
|
||||||
QString version, libs, other;
|
if(!conf->checkHeader(s, "libtorrent/magnet_uri.hpp")) {
|
||||||
VersionMode mode = VersionMin;
|
return false;
|
||||||
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
|
}
|
||||||
return false;
|
}else{
|
||||||
for(int n = 0; n < incs.count(); ++n)
|
QStringList sl;
|
||||||
conf->addIncludePath(incs[n]);
|
sl << "/usr/include";
|
||||||
if(!libs.isEmpty())
|
sl << "/usr/local/include";
|
||||||
conf->addLib(libs);
|
bool found = false;
|
||||||
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
foreach(s, sl){
|
||||||
printf("\nWarning: libtorrent-rasterbar v%s was detected. Although it will compile and run, you will probably experience some bugs. Please consider updating to v%s!\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data());
|
if(conf->checkHeader(s, "libtorrent/magnet_uri.hpp")){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
conf->addIncludePath(s);
|
||||||
|
conf->addIncludePath(s+QDir::separator()+"libtorrent");
|
||||||
|
|
||||||
|
s = conf->getenv("QC_WITH_LIBTORRENT_STATIC_LIB");
|
||||||
|
if(!s.isEmpty() && QFile::exists(s) && s.endsWith(".a")){
|
||||||
|
conf->addLib(s);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
s = conf->getenv("QC_WITH_LIBTORRENT_LIB");
|
||||||
|
if(!s.isEmpty()) {
|
||||||
|
if(!conf->checkLibrary(s, "torrent-rasterbar")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
conf->addLib(QString("-L") + s);
|
||||||
|
}else{
|
||||||
|
QStringList sl;
|
||||||
|
sl << "/usr/lib/";
|
||||||
|
sl << "/usr/lib64/";
|
||||||
|
sl << "/usr/local/lib/";
|
||||||
|
sl << "/usr/local/lib64/";
|
||||||
|
bool found = false;
|
||||||
|
foreach(s, sl){
|
||||||
|
if(conf->checkLibrary(s, "torrent-rasterbar")){
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!found) return false;
|
||||||
|
conf->addLib(QString("-L") + s);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,480 +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
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef FEEDDOWNLOADER_H
|
|
||||||
#define FEEDDOWNLOADER_H
|
|
||||||
|
|
||||||
#include <QString>
|
|
||||||
#include <QHash>
|
|
||||||
#include <QSettings>
|
|
||||||
#include <QListWidget>
|
|
||||||
#include <QListWidgetItem>
|
|
||||||
#include <QInputDialog>
|
|
||||||
#include <QMessageBox>
|
|
||||||
#include <QRegExp>
|
|
||||||
#include <QMenu>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QDataStream>
|
|
||||||
#include <QFileDialog>
|
|
||||||
|
|
||||||
#include "bittorrent.h"
|
|
||||||
#include "ui_FeedDownloader.h"
|
|
||||||
|
|
||||||
class FeedFilter: public QHash<QString, QVariant> {
|
|
||||||
private:
|
|
||||||
bool valid;
|
|
||||||
public:
|
|
||||||
FeedFilter():valid(true) {}
|
|
||||||
FeedFilter(bool valid): valid(valid) {}
|
|
||||||
FeedFilter(QHash<QString, QVariant> filter): QHash<QString, QVariant>(filter), valid(true) {}
|
|
||||||
|
|
||||||
bool matches(QString s) {
|
|
||||||
QStringList match_tokens = getMatchingTokens();
|
|
||||||
foreach(const QString& token, match_tokens) {
|
|
||||||
if(token.isEmpty() || token == "")
|
|
||||||
continue;
|
|
||||||
QRegExp reg(token, Qt::CaseInsensitive);
|
|
||||||
if(reg.indexIn(s) < 0) return false;
|
|
||||||
}
|
|
||||||
// Checking not matching
|
|
||||||
QStringList notmatch_tokens = getNotMatchingTokens();
|
|
||||||
foreach(const QString& token, notmatch_tokens) {
|
|
||||||
if(token.isEmpty()) continue;
|
|
||||||
QRegExp reg(token, Qt::CaseInsensitive);
|
|
||||||
if(reg.indexIn(s) > -1) return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isValid() const {
|
|
||||||
return valid;
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList getMatchingTokens() const {
|
|
||||||
QString matches = this->value("matches", "").toString();
|
|
||||||
return matches.split(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString getMatchingTokens_str() const {
|
|
||||||
return this->value("matches", "").toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setMatchingTokens(QString tokens) {
|
|
||||||
tokens = tokens.trimmed();
|
|
||||||
if(tokens.isEmpty())
|
|
||||||
(*this)["matches"] = "";
|
|
||||||
else
|
|
||||||
(*this)["matches"] = tokens;
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList getNotMatchingTokens() const {
|
|
||||||
QString notmatching = this->value("not", "").toString();
|
|
||||||
return notmatching.split(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString getNotMatchingTokens_str() const {
|
|
||||||
return this->value("not", "").toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setNotMatchingTokens(QString tokens) {
|
|
||||||
(*this)["not"] = tokens.trimmed();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString getSavePath() const {
|
|
||||||
return this->value("save_path", "").toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setSavePath(QString save_path) {
|
|
||||||
(*this)["save_path"] = save_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
class FeedFilters : public QHash<QString, QVariant> {
|
|
||||||
|
|
||||||
private:
|
|
||||||
QString feed_url;
|
|
||||||
|
|
||||||
public:
|
|
||||||
FeedFilters() {}
|
|
||||||
FeedFilters(QString feed_url, QHash<QString, QVariant> filters): QHash<QString, QVariant>(filters), feed_url(feed_url) {}
|
|
||||||
|
|
||||||
bool hasFilter(QString name) const {
|
|
||||||
return this->contains(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
FeedFilter* matches(QString s) {
|
|
||||||
if(!isDownloadingEnabled()) return 0;
|
|
||||||
if(this->size() == 0) return new FeedFilter(false);
|
|
||||||
foreach(QVariant var_hash_filter, this->values()) {
|
|
||||||
QHash<QString, QVariant> hash_filter = var_hash_filter.toHash();
|
|
||||||
FeedFilter *filter = new FeedFilter(hash_filter);
|
|
||||||
if(filter->matches(s))
|
|
||||||
return filter;
|
|
||||||
else
|
|
||||||
delete filter;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList names() const {
|
|
||||||
return this->keys();
|
|
||||||
}
|
|
||||||
|
|
||||||
FeedFilter getFilter(QString name) const {
|
|
||||||
if(this->contains(name))
|
|
||||||
return FeedFilter(this->value(name).toHash());
|
|
||||||
return FeedFilter();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setFilter(QString name, FeedFilter f) {
|
|
||||||
(*this)[name] = f;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isDownloadingEnabled() const {
|
|
||||||
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
|
||||||
QHash<QString, QVariant> feeds_w_downloader = qBTRSS.value("downloader_on", QHash<QString, QVariant>()).toHash();
|
|
||||||
return feeds_w_downloader.value(feed_url, false).toBool();
|
|
||||||
}
|
|
||||||
|
|
||||||
void setDownloadingEnabled(bool enabled) {
|
|
||||||
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
|
||||||
QHash<QString, QVariant> feeds_w_downloader = qBTRSS.value("downloader_on", QHash<QString, QVariant>()).toHash();
|
|
||||||
feeds_w_downloader[feed_url] = enabled;
|
|
||||||
qBTRSS.setValue("downloader_on", feeds_w_downloader);
|
|
||||||
}
|
|
||||||
|
|
||||||
static FeedFilters getFeedFilters(QString url) {
|
|
||||||
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
|
||||||
QHash<QString, QVariant> all_feeds_filters = qBTRSS.value("feed_filters", QHash<QString, QVariant>()).toHash();
|
|
||||||
return FeedFilters(url, all_feeds_filters.value(url, QHash<QString, QVariant>()).toHash());
|
|
||||||
}
|
|
||||||
|
|
||||||
void rename(QString old_name, QString new_name) {
|
|
||||||
Q_ASSERT(this->contains(old_name));
|
|
||||||
(*this)[new_name] = this->take(old_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool serialize(QString path) {
|
|
||||||
QFile f(path);
|
|
||||||
if(f.open(QIODevice::WriteOnly)) {
|
|
||||||
QDataStream out(&f);
|
|
||||||
out.setVersion(QDataStream::Qt_4_3);
|
|
||||||
out << (QHash<QString, QVariant>)(*this);
|
|
||||||
f.close();
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool unserialize(QString path) {
|
|
||||||
QFile f(path);
|
|
||||||
if(f.open(QIODevice::ReadOnly)) {
|
|
||||||
QDataStream in(&f);
|
|
||||||
in.setVersion(QDataStream::Qt_4_3);
|
|
||||||
QHash<QString, QVariant> tmp;
|
|
||||||
in >> tmp;
|
|
||||||
qDebug("Unserialized %d filters", tmp.size());
|
|
||||||
foreach(const QString& key, tmp.keys()) {
|
|
||||||
(*this)[key] = tmp[key];
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void save() {
|
|
||||||
QSettings qBTRSS("qBittorrent", "qBittorrent-rss");
|
|
||||||
QHash<QString, QVariant> all_feeds_filters = qBTRSS.value("feed_filters", QHash<QString, QVariant>()).toHash();
|
|
||||||
qDebug("Saving filters for feed: %s (%d filters)", feed_url.toLocal8Bit().data(), (*this).size());
|
|
||||||
all_feeds_filters[feed_url] = *this;
|
|
||||||
qBTRSS.setValue("feed_filters", all_feeds_filters);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class FeedDownloaderDlg : public QDialog, private Ui_FeedDownloader{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
private:
|
|
||||||
QString feed_url;
|
|
||||||
QString feed_name;
|
|
||||||
FeedFilters filters;
|
|
||||||
bittorrent *BTSession;
|
|
||||||
QString selected_filter; // name
|
|
||||||
|
|
||||||
public:
|
|
||||||
FeedDownloaderDlg(QWidget *parent, QString feed_url, QString feed_name, bittorrent* BTSession): QDialog(parent), feed_url(feed_url), feed_name(feed_name), BTSession(BTSession), selected_filter(QString::null){
|
|
||||||
setupUi(this);
|
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
|
||||||
Q_ASSERT(!feed_name.isEmpty());
|
|
||||||
rssfeed_lbl->setText(feed_name);
|
|
||||||
filters = FeedFilters::getFeedFilters(feed_url);
|
|
||||||
// Connect Signals/Slots
|
|
||||||
connect(filtersList, SIGNAL(currentItemChanged(QListWidgetItem* , QListWidgetItem *)), this, SLOT(showFilterSettings(QListWidgetItem *)));
|
|
||||||
connect(filtersList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFiltersListMenu(const QPoint&)));
|
|
||||||
connect(actionAdd_filter, SIGNAL(triggered()), this, SLOT(addFilter()));
|
|
||||||
connect(actionRemove_filter, SIGNAL(triggered()), this, SLOT(deleteFilter()));
|
|
||||||
connect(actionRename_filter, SIGNAL(triggered()), this, SLOT(renameFilter()));
|
|
||||||
connect(del_button, SIGNAL(clicked(bool)), this, SLOT(deleteFilter()));
|
|
||||||
connect(add_button, SIGNAL(clicked(bool)), this, SLOT(addFilter()));
|
|
||||||
connect(enableDl_cb, SIGNAL(stateChanged(int)), this, SLOT(enableFilterBox(int)));
|
|
||||||
// Restore saved info
|
|
||||||
enableDl_cb->setChecked(filters.isDownloadingEnabled());
|
|
||||||
fillFiltersList();
|
|
||||||
if(filters.size() > 0) {
|
|
||||||
// Select first filter
|
|
||||||
filtersList->setCurrentItem(filtersList->item(0));
|
|
||||||
//showFilterSettings(filtersList->item(0));
|
|
||||||
}
|
|
||||||
// Show
|
|
||||||
show();
|
|
||||||
}
|
|
||||||
|
|
||||||
~FeedDownloaderDlg() {
|
|
||||||
// Make sure we save everything
|
|
||||||
saveCurrentFilterSettings();
|
|
||||||
filters.save();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected slots:
|
|
||||||
void saveCurrentFilterSettings() {
|
|
||||||
if(!selected_filter.isEmpty()) {
|
|
||||||
FeedFilter filter = filters.getFilter(selected_filter);
|
|
||||||
filter.setMatchingTokens(match_line->text());
|
|
||||||
filter.setNotMatchingTokens(notmatch_line->text());
|
|
||||||
QString save_path = savepath_line->text().trimmed();
|
|
||||||
if(save_path.isEmpty())
|
|
||||||
save_path = BTSession->getDefaultSavePath();
|
|
||||||
filter.setSavePath(save_path);
|
|
||||||
// Save updated filter
|
|
||||||
filters.setFilter(selected_filter, filter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void fillFiltersList() {
|
|
||||||
// Fill filter list
|
|
||||||
foreach(QString filter_name, filters.names()) {
|
|
||||||
new QListWidgetItem(filter_name, filtersList);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void displayFiltersListMenu(const QPoint&) {
|
|
||||||
QMenu myFiltersListMenu(this);
|
|
||||||
if(filtersList->selectedItems().size() > 0) {
|
|
||||||
myFiltersListMenu.addAction(actionRename_filter);
|
|
||||||
myFiltersListMenu.addAction(actionRemove_filter);
|
|
||||||
} else {
|
|
||||||
myFiltersListMenu.addAction(actionAdd_filter);
|
|
||||||
}
|
|
||||||
// Call menu
|
|
||||||
myFiltersListMenu.exec(QCursor::pos());
|
|
||||||
}
|
|
||||||
|
|
||||||
void showFilterSettings(QListWidgetItem *item) {
|
|
||||||
// First, save current filter settings
|
|
||||||
saveCurrentFilterSettings();
|
|
||||||
// Clear all fields
|
|
||||||
clearFields();
|
|
||||||
if(!item) {
|
|
||||||
qDebug("No new selected item");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Actually show filter settings
|
|
||||||
QString filter_name = item->text();
|
|
||||||
FeedFilter filter = filters.getFilter(filter_name);
|
|
||||||
filterSettingsBox->setEnabled(true);
|
|
||||||
match_line->setText(filter.getMatchingTokens_str());
|
|
||||||
if(match_line->text().trimmed().isEmpty()) {
|
|
||||||
match_line->setText(filter_name);
|
|
||||||
}
|
|
||||||
notmatch_line->setText(filter.getNotMatchingTokens_str());
|
|
||||||
QString save_path = filter.getSavePath();
|
|
||||||
if(save_path.isEmpty())
|
|
||||||
save_path = BTSession->getDefaultSavePath();
|
|
||||||
savepath_line->setText(save_path);
|
|
||||||
// Update selected filter
|
|
||||||
selected_filter = filter_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
void deleteFilter() {
|
|
||||||
QList<QListWidgetItem *> items = filtersList->selectedItems();
|
|
||||||
if(items.size() == 1) {
|
|
||||||
QListWidgetItem * item = items.first();
|
|
||||||
filters.remove(item->text());
|
|
||||||
selected_filter = QString::null;
|
|
||||||
delete item;
|
|
||||||
// Reset Filter settings view
|
|
||||||
if(filters.size() == 0) {
|
|
||||||
clearFields();
|
|
||||||
filterSettingsBox->setEnabled(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void renameFilter() {
|
|
||||||
QList<QListWidgetItem *> items = filtersList->selectedItems();
|
|
||||||
if(items.size() == 1) {
|
|
||||||
QListWidgetItem *item = items.first();
|
|
||||||
QString current_name = item->text();
|
|
||||||
QString new_name;
|
|
||||||
bool validated = false;
|
|
||||||
do {
|
|
||||||
new_name = askFilterName(current_name);
|
|
||||||
if(new_name.isNull() || new_name == current_name) return;
|
|
||||||
if(!filters.hasFilter(new_name)) {
|
|
||||||
validated = true;
|
|
||||||
} else {
|
|
||||||
QMessageBox::warning(0, tr("Invalid filter name"), tr("This filter name is already in use."));
|
|
||||||
}
|
|
||||||
}while(!validated);
|
|
||||||
// Rename the filter
|
|
||||||
filters.rename(current_name, new_name);
|
|
||||||
if(selected_filter == current_name)
|
|
||||||
selected_filter = new_name;
|
|
||||||
item->setText(new_name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void enableFilterBox(int state) {
|
|
||||||
if(state == Qt::Checked) {
|
|
||||||
filtersBox->setEnabled(true);
|
|
||||||
filters.setDownloadingEnabled(true);
|
|
||||||
} else {
|
|
||||||
filtersBox->setEnabled(false);
|
|
||||||
filters.setDownloadingEnabled(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QString askFilterName(QString name=QString::null) {
|
|
||||||
QString name_prop;
|
|
||||||
if(name.isEmpty())
|
|
||||||
name_prop = tr("New filter");
|
|
||||||
else
|
|
||||||
name_prop = name;
|
|
||||||
QString new_name;
|
|
||||||
bool validated = false;
|
|
||||||
do {
|
|
||||||
bool ok;
|
|
||||||
new_name = QInputDialog::getText(this, tr("Please choose a name for this filter"), tr("Filter name:"), QLineEdit::Normal, name_prop, &ok);
|
|
||||||
if(!ok) {
|
|
||||||
return QString::null;
|
|
||||||
}
|
|
||||||
// Validate filter name
|
|
||||||
new_name = new_name.trimmed();
|
|
||||||
if(new_name.isEmpty()) {
|
|
||||||
// Cannot be left empty
|
|
||||||
QMessageBox::warning(0, tr("Invalid filter name"), tr("The filter name cannot be left empty."));
|
|
||||||
} else {
|
|
||||||
validated = true;
|
|
||||||
}
|
|
||||||
} while(!validated);
|
|
||||||
return new_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
void addFilter() {
|
|
||||||
QString filter_name = QString::null;
|
|
||||||
bool validated = false;
|
|
||||||
do {
|
|
||||||
filter_name = askFilterName();
|
|
||||||
if(filter_name.isNull()) return;
|
|
||||||
if(filters.hasFilter(filter_name)) {
|
|
||||||
// Filter alread exists
|
|
||||||
QMessageBox::warning(0, tr("Invalid filter name"), tr("This filter name is already in use."));
|
|
||||||
} else {
|
|
||||||
validated = true;
|
|
||||||
}
|
|
||||||
}while(!validated);
|
|
||||||
QListWidgetItem *it = new QListWidgetItem(filter_name, filtersList);
|
|
||||||
filtersList->setCurrentItem(it);
|
|
||||||
//showFilterSettings(it);
|
|
||||||
}
|
|
||||||
|
|
||||||
void clearFields() {
|
|
||||||
match_line->clear();
|
|
||||||
notmatch_line->clear();
|
|
||||||
savepath_line->clear();
|
|
||||||
test_res_lbl->setText("");
|
|
||||||
test_line->clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void on_testButton_clicked(bool) {
|
|
||||||
if(selected_filter.isEmpty()) return;
|
|
||||||
QString s = test_line->text().trimmed();
|
|
||||||
if(s.isEmpty()) {
|
|
||||||
QMessageBox::warning(0, tr("Filter testing error"), tr("Please specify a test torrent name."));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Get current filter
|
|
||||||
saveCurrentFilterSettings();
|
|
||||||
FeedFilter f = filters.getFilter(selected_filter);
|
|
||||||
if(f.matches(s))
|
|
||||||
test_res_lbl->setText("<b><font color=\"green\">"+tr("matches")+"</font></b>");
|
|
||||||
else
|
|
||||||
test_res_lbl->setText("<b><font color=\"red\">"+tr("does not match")+"</font></b>");
|
|
||||||
}
|
|
||||||
|
|
||||||
void on_importButton_clicked(bool) {
|
|
||||||
QString source = QFileDialog::getOpenFileName(0, tr("Select file to import"), QDir::homePath(), tr("Filters Files")+QString::fromUtf8(" (*.filters)"));
|
|
||||||
if(source.isEmpty()) return;
|
|
||||||
if(filters.unserialize(source)) {
|
|
||||||
// Clean up first
|
|
||||||
clearFields();
|
|
||||||
filtersList->clear();
|
|
||||||
selected_filter = QString::null;
|
|
||||||
fillFiltersList();
|
|
||||||
if(filters.size() > 0)
|
|
||||||
filtersList->setCurrentItem(filtersList->item(0));
|
|
||||||
QMessageBox::information(0, tr("Import successful"), tr("Filters import was successful."));
|
|
||||||
} else {
|
|
||||||
QMessageBox::warning(0, tr("Import failure"), tr("Filters could not be imported due to an I/O error."));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void on_exportButton_clicked(bool) {
|
|
||||||
QString destination = QFileDialog::getSaveFileName(this, tr("Select destination file"), QDir::homePath(), tr("Filters Files")+QString::fromUtf8(" (*.filters)"));
|
|
||||||
if(destination.isEmpty()) return;
|
|
||||||
// Append file extension
|
|
||||||
if(!destination.endsWith(".filters"))
|
|
||||||
destination += ".filters";
|
|
||||||
if(QFile::exists(destination)) {
|
|
||||||
int ret = QMessageBox::question(0, tr("Overwriting confirmation"), tr("Are you sure you want to overwrite existing file?"), QMessageBox::Yes|QMessageBox::No);
|
|
||||||
if(ret != QMessageBox::Yes) return;
|
|
||||||
}
|
|
||||||
if(filters.serialize(destination))
|
|
||||||
QMessageBox::information(0, tr("Export successful"), tr("Filters export was successful."));
|
|
||||||
else
|
|
||||||
QMessageBox::warning(0, tr("Export failure"), tr("Filters could not be exported due to an I/O error."));
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // FEEDDOWNLOADER_H
|
|
||||||
@@ -1,546 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>FeedDownloader</class>
|
|
||||||
<widget class="QDialog" name="FeedDownloader">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>737</width>
|
|
||||||
<height>415</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>RSS Feed downloader</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_7">
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>16</pointsize>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>RSS feed:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="rssfeed_lbl">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>16</pointsize>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Feed name</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer_5">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="enableDl_cb">
|
|
||||||
<property name="text">
|
|
||||||
<string>Automatically download torrents from this feed</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="filtersBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Download filters</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_6">
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Filters:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QListWidget" name="filtersList">
|
|
||||||
<property name="contextMenuPolicy">
|
|
||||||
<enum>Qt::CustomContextMenu</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer_2">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="del_button">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="icons.qrc">
|
|
||||||
<normaloff>:/Icons/oxygen/list-remove.png</normaloff>:/Icons/oxygen/list-remove.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer_4">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeType">
|
|
||||||
<enum>QSizePolicy::Fixed</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>10</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="add_button">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="icons.qrc">
|
|
||||||
<normaloff>:/Icons/oxygen/list-add.png</normaloff>:/Icons/oxygen/list-add.png</iconset>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer_3">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="filterSettingsBox">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>75</weight>
|
|
||||||
<bold>true</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="autoFillBackground">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="styleSheet">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
<property name="title">
|
|
||||||
<string>Filter settings</string>
|
|
||||||
</property>
|
|
||||||
<property name="flat">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_9">
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_3">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>50</weight>
|
|
||||||
<bold>false</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Matches:</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_4">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>50</weight>
|
|
||||||
<bold>false</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Does not match:</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_5">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>50</weight>
|
|
||||||
<bold>false</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Destination folder:</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="match_line">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="notmatch_line"/>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="savepath_line">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>300</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QToolButton" name="browse_button">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>50</weight>
|
|
||||||
<bold>false</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>...</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QGroupBox" name="testerBox">
|
|
||||||
<property name="title">
|
|
||||||
<string>Filter testing</string>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_8">
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_6">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>0</width>
|
|
||||||
<height>28</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>50</weight>
|
|
||||||
<bold>false</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Torrent title:</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_7">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>50</weight>
|
|
||||||
<bold>false</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Result:</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_8">
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="test_line"/>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="testButton">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>50</weight>
|
|
||||||
<bold>false</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Test</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_7">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="test_res_lbl">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<weight>50</weight>
|
|
||||||
<bold>false</bold>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string> </string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer_6">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>9</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_10">
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="importButton">
|
|
||||||
<property name="text">
|
|
||||||
<string>Import...</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QPushButton" name="exportButton">
|
|
||||||
<property name="text">
|
|
||||||
<string>Export...</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QDialogButtonBox" name="buttonBox">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="standardButtons">
|
|
||||||
<set>QDialogButtonBox::Close</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
<action name="actionRename_filter">
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="icons.qrc">
|
|
||||||
<normaloff>:/Icons/oxygen/edit_clear.png</normaloff>:/Icons/oxygen/edit_clear.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Rename filter</string>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Rename filter</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionRemove_filter">
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="icons.qrc">
|
|
||||||
<normaloff>:/Icons/oxygen/list-remove.png</normaloff>:/Icons/oxygen/list-remove.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Remove filter</string>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Remove filter</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionAdd_filter">
|
|
||||||
<property name="icon">
|
|
||||||
<iconset resource="icons.qrc">
|
|
||||||
<normaloff>:/Icons/oxygen/list-add.png</normaloff>:/Icons/oxygen/list-add.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Add filter</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
</widget>
|
|
||||||
<resources>
|
|
||||||
<include location="icons.qrc"/>
|
|
||||||
</resources>
|
|
||||||
<connections>
|
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>accepted()</signal>
|
|
||||||
<receiver>FeedDownloader</receiver>
|
|
||||||
<slot>accept()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>248</x>
|
|
||||||
<y>254</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>157</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>rejected()</signal>
|
|
||||||
<receiver>FeedDownloader</receiver>
|
|
||||||
<slot>reject()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>316</x>
|
|
||||||
<y>260</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>286</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
</connections>
|
|
||||||
</ui>
|
|
||||||
@@ -44,11 +44,9 @@
|
|||||||
#define F_NAME 0
|
#define F_NAME 0
|
||||||
#define F_SIZE 1
|
#define F_SIZE 1
|
||||||
#define F_UPSPEED 2
|
#define F_UPSPEED 2
|
||||||
#define F_SWARM 3
|
#define F_LEECH 3
|
||||||
#define F_PEERS 4
|
#define F_RATIO 4
|
||||||
#define F_UPLOAD 5
|
#define F_HASH 5
|
||||||
#define F_RATIO 6
|
|
||||||
#define F_HASH 7
|
|
||||||
|
|
||||||
#define MAX_RATIO 100.
|
#define MAX_RATIO 100.
|
||||||
|
|
||||||
@@ -64,7 +62,6 @@ class FinishedListDelegate: public QItemDelegate {
|
|||||||
QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option);
|
QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option);
|
||||||
switch(index.column()){
|
switch(index.column()){
|
||||||
case F_SIZE:
|
case F_SIZE:
|
||||||
case F_UPLOAD:
|
|
||||||
QItemDelegate::drawBackground(painter, opt, index);
|
QItemDelegate::drawBackground(painter, opt, index);
|
||||||
QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong()));
|
QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong()));
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -38,7 +38,6 @@
|
|||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QStandardItemModel>
|
#include <QStandardItemModel>
|
||||||
#include <QSortFilterProxyModel>
|
|
||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
@@ -47,24 +46,15 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
|
|||||||
setupUi(this);
|
setupUi(this);
|
||||||
actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png")));
|
actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png")));
|
||||||
actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png")));
|
actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png")));
|
||||||
finishedListModel = new QStandardItemModel(0,8);
|
finishedListModel = new QStandardItemModel(0,6);
|
||||||
finishedListModel->setHeaderData(F_NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
|
finishedListModel->setHeaderData(F_NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
|
||||||
finishedListModel->setHeaderData(F_SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
|
finishedListModel->setHeaderData(F_SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
|
||||||
finishedListModel->setHeaderData(F_UPSPEED, Qt::Horizontal, tr("UP Speed", "i.e: Upload speed"));
|
finishedListModel->setHeaderData(F_UPSPEED, Qt::Horizontal, tr("UP Speed", "i.e: Upload speed"));
|
||||||
finishedListModel->setHeaderData(F_SWARM, Qt::Horizontal, tr("Seeds / Leechers"));
|
finishedListModel->setHeaderData(F_LEECH, Qt::Horizontal, tr("Leechers", "i.e: full/partial sources"));
|
||||||
finishedListModel->setHeaderData(F_PEERS, Qt::Horizontal, tr("Connected peers"));
|
|
||||||
finishedListModel->setHeaderData(F_UPLOAD, Qt::Horizontal, tr("Total uploaded", "i.e: Total amount of uploaded data"));
|
|
||||||
finishedListModel->setHeaderData(F_RATIO, Qt::Horizontal, tr("Ratio"));
|
finishedListModel->setHeaderData(F_RATIO, Qt::Horizontal, tr("Ratio"));
|
||||||
|
finishedList->setModel(finishedListModel);
|
||||||
proxyModel = new QSortFilterProxyModel();
|
|
||||||
proxyModel->setDynamicSortFilter(true);
|
|
||||||
proxyModel->setSourceModel(finishedListModel);
|
|
||||||
finishedList->setModel(proxyModel);
|
|
||||||
|
|
||||||
finishedList->setRootIsDecorated(false);
|
finishedList->setRootIsDecorated(false);
|
||||||
finishedList->setAllColumnsShowFocus(true);
|
finishedList->setAllColumnsShowFocus(true);
|
||||||
finishedList->setSortingEnabled(true);
|
|
||||||
|
|
||||||
loadHiddenColumns();
|
loadHiddenColumns();
|
||||||
// Hide hash column
|
// Hide hash column
|
||||||
finishedList->hideColumn(F_HASH);
|
finishedList->hideColumn(F_HASH);
|
||||||
@@ -72,11 +62,10 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
|
|||||||
if(!loadColWidthFinishedList()){
|
if(!loadColWidthFinishedList()){
|
||||||
finishedList->header()->resizeSection(0, 200);
|
finishedList->header()->resizeSection(0, 200);
|
||||||
}
|
}
|
||||||
// Connect BTSession signals
|
|
||||||
connect(BTSession, SIGNAL(metadataReceived(QTorrentHandle&)), this, SLOT(updateMetadata(QTorrentHandle&)));
|
|
||||||
// Make download list header clickable for sorting
|
// Make download list header clickable for sorting
|
||||||
finishedList->header()->setClickable(true);
|
finishedList->header()->setClickable(true);
|
||||||
finishedList->header()->setSortIndicatorShown(true);
|
finishedList->header()->setSortIndicatorShown(true);
|
||||||
|
connect(finishedList->header(), SIGNAL(sectionPressed(int)), this, SLOT(toggleFinishedListSortOrder(int)));
|
||||||
finishedListDelegate = new FinishedListDelegate(finishedList);
|
finishedListDelegate = new FinishedListDelegate(finishedList);
|
||||||
finishedList->setItemDelegate(finishedListDelegate);
|
finishedList->setItemDelegate(finishedListDelegate);
|
||||||
connect(finishedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedListMenu(const QPoint&)));
|
connect(finishedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedListMenu(const QPoint&)));
|
||||||
@@ -88,8 +77,6 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
|
|||||||
actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png")));
|
actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png")));
|
||||||
actionTorrent_Properties->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/properties.png")));
|
actionTorrent_Properties->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/properties.png")));
|
||||||
actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png")));
|
actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png")));
|
||||||
actionCopy_magnet_link->setIcon(QIcon(QString::fromUtf8(":/Icons/magnet.png")));
|
|
||||||
|
|
||||||
connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered()));
|
connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered()));
|
||||||
connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered()));
|
connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered()));
|
||||||
connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered()));
|
connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered()));
|
||||||
@@ -99,23 +86,18 @@ FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : par
|
|||||||
connect(actionBuy_it, SIGNAL(triggered()), (GUI*)parent, SLOT(goBuyPage()));
|
connect(actionBuy_it, SIGNAL(triggered()), (GUI*)parent, SLOT(goBuyPage()));
|
||||||
connect(actionTorrent_Properties, SIGNAL(triggered()), this, SLOT(propertiesSelection()));
|
connect(actionTorrent_Properties, SIGNAL(triggered()), this, SLOT(propertiesSelection()));
|
||||||
connect(actionForce_recheck, SIGNAL(triggered()), this, SLOT(forceRecheck()));
|
connect(actionForce_recheck, SIGNAL(triggered()), this, SLOT(forceRecheck()));
|
||||||
connect(actionCopy_magnet_link, SIGNAL(triggered()), (GUI*)parent, SLOT(copyMagnetURI()));
|
|
||||||
|
|
||||||
connect(actionHOSColName, SIGNAL(triggered()), this, SLOT(hideOrShowColumnName()));
|
connect(actionHOSColName, SIGNAL(triggered()), this, SLOT(hideOrShowColumnName()));
|
||||||
connect(actionHOSColSize, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSize()));
|
connect(actionHOSColSize, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSize()));
|
||||||
connect(actionHOSColUpSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpSpeed()));
|
connect(actionHOSColUpSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpSpeed()));
|
||||||
connect(actionHOSColSwarm, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSwarm()));
|
connect(actionHOSColLeechers, SIGNAL(triggered()), this, SLOT(hideOrShowColumnLeechers()));
|
||||||
connect(actionHOSColPeers, SIGNAL(triggered()), this, SLOT(hideOrShowColumnPeers()));
|
|
||||||
connect(actionHOSColUpload, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpload()));
|
|
||||||
connect(actionHOSColRatio, SIGNAL(triggered()), this, SLOT(hideOrShowColumnRatio()));
|
connect(actionHOSColRatio, SIGNAL(triggered()), this, SLOT(hideOrShowColumnRatio()));
|
||||||
}
|
}
|
||||||
|
|
||||||
FinishedTorrents::~FinishedTorrents(){
|
FinishedTorrents::~FinishedTorrents(){
|
||||||
saveLastSortedColumn();
|
|
||||||
saveColWidthFinishedList();
|
saveColWidthFinishedList();
|
||||||
saveHiddenColumns();
|
saveHiddenColumns();
|
||||||
delete finishedListDelegate;
|
delete finishedListDelegate;
|
||||||
delete proxyModel;
|
|
||||||
delete finishedListModel;
|
delete finishedListModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,9 +117,7 @@ void FinishedTorrents::addTorrent(QString hash){
|
|||||||
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(h.name()));
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(h.name()));
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_SIZE), QVariant((qlonglong)h.actual_size()));
|
finishedListModel->setData(finishedListModel->index(row, F_SIZE), QVariant((qlonglong)h.actual_size()));
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.));
|
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.));
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_SWARM), QVariant("-1/-1"));
|
finishedListModel->setData(finishedListModel->index(row, F_LEECH), QVariant("0"));
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_PEERS), QVariant("0"));
|
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_UPLOAD), QVariant((qlonglong)h.all_time_upload()));
|
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(QString::fromUtf8(misc::toString(BTSession->getRealRatio(hash)).c_str())));
|
finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(QString::fromUtf8(misc::toString(BTSession->getRealRatio(hash)).c_str())));
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_HASH), QVariant(hash));
|
finishedListModel->setData(finishedListModel->index(row, F_HASH), QVariant(hash));
|
||||||
if(h.is_paused()) {
|
if(h.is_paused()) {
|
||||||
@@ -150,8 +130,8 @@ void FinishedTorrents::addTorrent(QString hash){
|
|||||||
// Update the number of finished torrents
|
// Update the number of finished torrents
|
||||||
++nbFinished;
|
++nbFinished;
|
||||||
emit finishedTorrentsNumberChanged(nbFinished);
|
emit finishedTorrentsNumberChanged(nbFinished);
|
||||||
|
// Sort List
|
||||||
loadLastSortedColumn();
|
sortFinishedList();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the color of a row in data model
|
// Set the color of a row in data model
|
||||||
@@ -168,7 +148,7 @@ QStringList FinishedTorrents::getSelectedTorrents(bool only_one) const{
|
|||||||
foreach(const QModelIndex &index, selectedIndexes) {
|
foreach(const QModelIndex &index, selectedIndexes) {
|
||||||
if(index.column() == F_NAME) {
|
if(index.column() == F_NAME) {
|
||||||
// Get the file hash
|
// Get the file hash
|
||||||
QString hash = getHashFromRow(index.row());
|
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
||||||
res << hash;
|
res << hash;
|
||||||
if(only_one) break;
|
if(only_one) break;
|
||||||
}
|
}
|
||||||
@@ -196,39 +176,10 @@ bool FinishedTorrents::loadColWidthFinishedList(){
|
|||||||
finishedList->header()->resizeSection(i, width_list.at(i).toInt());
|
finishedList->header()->resizeSection(i, width_list.at(i).toInt());
|
||||||
}
|
}
|
||||||
loadLastSortedColumn();
|
loadLastSortedColumn();
|
||||||
QVariantList visualIndexes = settings.value(QString::fromUtf8("FinishedListVisualIndexes"), QVariantList()).toList();
|
|
||||||
if(visualIndexes.size() != finishedListModel->columnCount()-1) {
|
|
||||||
qDebug("Corrupted values for download list columns sizes");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
bool change = false;
|
|
||||||
do {
|
|
||||||
change = false;
|
|
||||||
for(int i=0;i<visualIndexes.size(); ++i) {
|
|
||||||
int new_visual_index = visualIndexes.at(finishedList->header()->logicalIndex(i)).toInt();
|
|
||||||
if(i != new_visual_index) {
|
|
||||||
qDebug("Moving column from %d to %d", finishedList->header()->logicalIndex(i), new_visual_index);
|
|
||||||
finishedList->header()->moveSection(i, new_visual_index);
|
|
||||||
change = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}while(change);
|
|
||||||
qDebug("Finished list columns width loaded");
|
qDebug("Finished list columns width loaded");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::saveLastSortedColumn() {
|
|
||||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
|
||||||
Qt::SortOrder sortOrder = finishedList->header()->sortIndicatorOrder();
|
|
||||||
QString sortOrderLetter;
|
|
||||||
if(sortOrder == Qt::AscendingOrder)
|
|
||||||
sortOrderLetter = QString::fromUtf8("a");
|
|
||||||
else
|
|
||||||
sortOrderLetter = QString::fromUtf8("d");
|
|
||||||
int index = finishedList->header()->sortIndicatorSection();
|
|
||||||
settings.setValue(QString::fromUtf8("FinishedListSortedCol"), misc::toQString(index)+sortOrderLetter);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FinishedTorrents::loadLastSortedColumn() {
|
void FinishedTorrents::loadLastSortedColumn() {
|
||||||
// Loading last sorted column
|
// Loading last sorted column
|
||||||
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
@@ -241,7 +192,7 @@ void FinishedTorrents::loadLastSortedColumn() {
|
|||||||
sortOrder = Qt::AscendingOrder;
|
sortOrder = Qt::AscendingOrder;
|
||||||
sortedCol = sortedCol.left(sortedCol.size()-1);
|
sortedCol = sortedCol.left(sortedCol.size()-1);
|
||||||
int index = sortedCol.toInt();
|
int index = sortedCol.toInt();
|
||||||
finishedList->sortByColumn(index, sortOrder);
|
sortFinishedList(index, sortOrder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,7 +210,7 @@ void FinishedTorrents::saveColWidthFinishedList() const{
|
|||||||
width_list = line.split(' ');
|
width_list = line.split(' ');
|
||||||
}
|
}
|
||||||
for(short i=0; i<nbColumns; ++i){
|
for(short i=0; i<nbColumns; ++i){
|
||||||
if(finishedList->columnWidth(i)<1 && width_list.size() == nbColumns && width_list.at(i).toInt()>=1) {
|
if(finishedList->columnWidth(i)<1 && width_list.size() == finishedListModel->columnCount()-1 && width_list.at(i).toInt()>=1) {
|
||||||
// load the former width
|
// load the former width
|
||||||
new_width_list << width_list.at(i);
|
new_width_list << width_list.at(i);
|
||||||
} else if(finishedList->columnWidth(i)>=1) {
|
} else if(finishedList->columnWidth(i)>=1) {
|
||||||
@@ -272,11 +223,6 @@ void FinishedTorrents::saveColWidthFinishedList() const{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
settings.setValue("FinishedListColsWidth", new_width_list.join(" "));
|
settings.setValue("FinishedListColsWidth", new_width_list.join(" "));
|
||||||
QVariantList visualIndexes;
|
|
||||||
for(int i=0; i<nbColumns; ++i) {
|
|
||||||
visualIndexes.append(finishedList->header()->visualIndex(i));
|
|
||||||
}
|
|
||||||
settings.setValue(QString::fromUtf8("FinishedListVisualIndexes"), visualIndexes);
|
|
||||||
qDebug("Finished list columns width saved");
|
qDebug("Finished list columns width saved");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,24 +232,13 @@ void FinishedTorrents::on_actionSet_upload_limit_triggered(){
|
|||||||
foreach(const QModelIndex &index, selectedIndexes){
|
foreach(const QModelIndex &index, selectedIndexes){
|
||||||
if(index.column() == F_NAME){
|
if(index.column() == F_NAME){
|
||||||
// Get the file hash
|
// Get the file hash
|
||||||
hashes << getHashFromRow(index.row());
|
hashes << finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
new BandwidthAllocationDialog(this, true, BTSession, hashes);
|
new BandwidthAllocationDialog(this, true, BTSession, hashes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::updateMetadata(QTorrentHandle &h) {
|
|
||||||
QString hash = h.hash();
|
|
||||||
int row = getRowFromHash(hash);
|
|
||||||
if(row != -1) {
|
|
||||||
qDebug("Updating torrent metadata in download list");
|
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(h.name()));
|
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_SIZE), QVariant((qlonglong)h.actual_size()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FinishedTorrents::updateTorrent(QTorrentHandle h) {
|
void FinishedTorrents::updateTorrent(QTorrentHandle h) {
|
||||||
if(!h.is_valid()) return;
|
|
||||||
QString hash = h.hash();
|
QString hash = h.hash();
|
||||||
int row = getRowFromHash(hash);
|
int row = getRowFromHash(hash);
|
||||||
if(row == -1){
|
if(row == -1){
|
||||||
@@ -312,25 +247,22 @@ void FinishedTorrents::updateTorrent(QTorrentHandle h) {
|
|||||||
row = getRowFromHash(hash);
|
row = getRowFromHash(hash);
|
||||||
}
|
}
|
||||||
Q_ASSERT(row != -1);
|
Q_ASSERT(row != -1);
|
||||||
if(!finishedList->isColumnHidden(F_SWARM)) {
|
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_SWARM), misc::toQString(h.num_complete())+QString("/")+misc::toQString(h.num_incomplete()));
|
|
||||||
}
|
|
||||||
if(h.is_paused()) return;
|
if(h.is_paused()) return;
|
||||||
// Update queued torrent
|
// Update queued torrent
|
||||||
if(BTSession->isQueueingEnabled() && h.is_queued()) {
|
if(BTSession->isQueueingEnabled() && h.is_queued()) {
|
||||||
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){
|
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole);
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/time.png"))), Qt::DecorationRole);
|
||||||
} else {
|
} else {
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole);
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole);
|
||||||
}
|
}
|
||||||
// Reset upload speed and seeds/leech
|
// Reset upload speed and seeds/leech
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), 0.);
|
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), 0.);
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_PEERS), "0");
|
finishedListModel->setData(finishedListModel->index(row, F_LEECH), "0");
|
||||||
setRowColor(row, QString::fromUtf8("grey"));
|
setRowColor(row, QString::fromUtf8("grey"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){
|
if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole);
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/time.png"))), Qt::DecorationRole);
|
||||||
setRowColor(row, QString::fromUtf8("grey"));
|
setRowColor(row, QString::fromUtf8("grey"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -339,11 +271,8 @@ void FinishedTorrents::updateTorrent(QTorrentHandle h) {
|
|||||||
if(!finishedList->isColumnHidden(F_UPSPEED)) {
|
if(!finishedList->isColumnHidden(F_UPSPEED)) {
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)h.upload_payload_rate()));
|
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)h.upload_payload_rate()));
|
||||||
}
|
}
|
||||||
if(!finishedList->isColumnHidden(F_PEERS)) {
|
if(!finishedList->isColumnHidden(F_LEECH)) {
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_PEERS), misc::toQString(h.num_peers() - h.num_seeds(), true));
|
finishedListModel->setData(finishedListModel->index(row, F_LEECH), misc::toQString(h.num_peers() - h.num_seeds(), true));
|
||||||
}
|
|
||||||
if(!finishedList->isColumnHidden(F_UPLOAD)) {
|
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_UPLOAD), QVariant((double)h.all_time_upload()));
|
|
||||||
}
|
}
|
||||||
if(!finishedList->isColumnHidden(F_RATIO)) {
|
if(!finishedList->isColumnHidden(F_RATIO)) {
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(misc::toQString(BTSession->getRealRatio(hash))));
|
finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(misc::toQString(BTSession->getRealRatio(hash))));
|
||||||
@@ -367,13 +296,13 @@ void FinishedTorrents::pauseTorrent(QString hash) {
|
|||||||
return;
|
return;
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.0));
|
finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.0));
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_NAME), QIcon(QString::fromUtf8(":/Icons/skin/paused.png")), Qt::DecorationRole);
|
finishedListModel->setData(finishedListModel->index(row, F_NAME), QIcon(QString::fromUtf8(":/Icons/skin/paused.png")), Qt::DecorationRole);
|
||||||
finishedListModel->setData(finishedListModel->index(row, F_PEERS), QVariant(QString::fromUtf8("0")));
|
finishedListModel->setData(finishedListModel->index(row, F_LEECH), QVariant(QString::fromUtf8("0")));
|
||||||
setRowColor(row, QString::fromUtf8("red"));
|
setRowColor(row, QString::fromUtf8("red"));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString FinishedTorrents::getHashFromRow(unsigned int row) const {
|
QString FinishedTorrents::getHashFromRow(unsigned int row) const {
|
||||||
Q_ASSERT(row < (unsigned int)proxyModel->rowCount());
|
Q_ASSERT(row < (unsigned int)finishedListModel->rowCount());
|
||||||
return proxyModel->data(proxyModel->index(row, F_HASH)).toString();
|
return finishedListModel->data(finishedListModel->index(row, F_HASH)).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Will move it to download tab
|
// Will move it to download tab
|
||||||
@@ -390,7 +319,7 @@ void FinishedTorrents::deleteTorrent(QString hash){
|
|||||||
|
|
||||||
// Show torrent properties dialog
|
// Show torrent properties dialog
|
||||||
void FinishedTorrents::showProperties(const QModelIndex &index){
|
void FinishedTorrents::showProperties(const QModelIndex &index){
|
||||||
showPropertiesFromHash(getHashFromRow(index.row()));
|
showPropertiesFromHash(finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::showPropertiesFromHash(QString hash){
|
void FinishedTorrents::showPropertiesFromHash(QString hash){
|
||||||
@@ -421,9 +350,8 @@ void FinishedTorrents::forceRecheck(){
|
|||||||
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
|
||||||
foreach(const QModelIndex &index, selectedIndexes){
|
foreach(const QModelIndex &index, selectedIndexes){
|
||||||
if(index.column() == F_NAME){
|
if(index.column() == F_NAME){
|
||||||
QString hash = getHashFromRow(index.row());
|
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
||||||
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||||
qDebug("Forcing recheck for torrent %s", hash.toLocal8Bit().data());
|
|
||||||
h.force_recheck();
|
h.force_recheck();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -437,7 +365,7 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint&){
|
|||||||
foreach(const QModelIndex &index, selectedIndexes) {
|
foreach(const QModelIndex &index, selectedIndexes) {
|
||||||
if(index.column() == F_NAME) {
|
if(index.column() == F_NAME) {
|
||||||
// Get the file name
|
// Get the file name
|
||||||
QString hash = getHashFromRow(index.row());
|
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString();
|
||||||
// Get handle and pause the torrent
|
// Get handle and pause the torrent
|
||||||
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
QTorrentHandle h = BTSession->getTorrentHandle(hash);
|
||||||
if(!h.is_valid()) continue;
|
if(!h.is_valid()) continue;
|
||||||
@@ -470,7 +398,6 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint&){
|
|||||||
myFinishedListMenu.addAction(actionOpen_destination_folder);
|
myFinishedListMenu.addAction(actionOpen_destination_folder);
|
||||||
myFinishedListMenu.addAction(actionTorrent_Properties);
|
myFinishedListMenu.addAction(actionTorrent_Properties);
|
||||||
myFinishedListMenu.addSeparator();
|
myFinishedListMenu.addSeparator();
|
||||||
myFinishedListMenu.addAction(actionCopy_magnet_link);
|
|
||||||
myFinishedListMenu.addAction(actionBuy_it);
|
myFinishedListMenu.addAction(actionBuy_it);
|
||||||
|
|
||||||
// Call menu
|
// Call menu
|
||||||
@@ -483,7 +410,7 @@ void FinishedTorrents::displayFinishedListMenu(const QPoint&){
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// hide/show columns menu
|
// hide/show columns menu
|
||||||
void FinishedTorrents::displayFinishedHoSMenu(const QPoint&){
|
void FinishedTorrents::displayFinishedHoSMenu(const QPoint& pos){
|
||||||
QMenu hideshowColumn(this);
|
QMenu hideshowColumn(this);
|
||||||
hideshowColumn.setTitle(tr("Hide or Show Column"));
|
hideshowColumn.setTitle(tr("Hide or Show Column"));
|
||||||
int lastCol = F_RATIO;
|
int lastCol = F_RATIO;
|
||||||
@@ -491,7 +418,7 @@ void FinishedTorrents::displayFinishedHoSMenu(const QPoint&){
|
|||||||
hideshowColumn.addAction(getActionHoSCol(i));
|
hideshowColumn.addAction(getActionHoSCol(i));
|
||||||
}
|
}
|
||||||
// Call menu
|
// Call menu
|
||||||
hideshowColumn.exec(QCursor::pos());
|
hideshowColumn.exec(mapToGlobal(pos)+QPoint(10,34));
|
||||||
}
|
}
|
||||||
|
|
||||||
// toggle hide/show a column
|
// toggle hide/show a column
|
||||||
@@ -509,12 +436,12 @@ void FinishedTorrents::hideOrShowColumn(int index) {
|
|||||||
if(nbVisibleColumns <= 1) return;
|
if(nbVisibleColumns <= 1) return;
|
||||||
// User can hide the column, do it.
|
// User can hide the column, do it.
|
||||||
finishedList->setColumnHidden(index, true);
|
finishedList->setColumnHidden(index, true);
|
||||||
getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png")));
|
getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_cancel.png")));
|
||||||
--nbVisibleColumns;
|
--nbVisibleColumns;
|
||||||
} else {
|
} else {
|
||||||
// User want to display the column
|
// User want to display the column
|
||||||
finishedList->setColumnHidden(index, false);
|
finishedList->setColumnHidden(index, false);
|
||||||
getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png")));
|
getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_ok.png")));
|
||||||
++nbVisibleColumns;
|
++nbVisibleColumns;
|
||||||
}
|
}
|
||||||
//resize all others non-hidden columns
|
//resize all others non-hidden columns
|
||||||
@@ -537,16 +464,8 @@ void FinishedTorrents::hideOrShowColumnUpSpeed() {
|
|||||||
hideOrShowColumn(F_UPSPEED);
|
hideOrShowColumn(F_UPSPEED);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::hideOrShowColumnSwarm() {
|
void FinishedTorrents::hideOrShowColumnLeechers() {
|
||||||
hideOrShowColumn(F_SWARM);
|
hideOrShowColumn(F_LEECH);
|
||||||
}
|
|
||||||
|
|
||||||
void FinishedTorrents::hideOrShowColumnPeers() {
|
|
||||||
hideOrShowColumn(F_PEERS);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FinishedTorrents::hideOrShowColumnUpload() {
|
|
||||||
hideOrShowColumn(F_UPLOAD);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FinishedTorrents::hideOrShowColumnRatio() {
|
void FinishedTorrents::hideOrShowColumnRatio() {
|
||||||
@@ -572,9 +491,9 @@ bool FinishedTorrents::loadHiddenColumns() {
|
|||||||
for(int i=0; i<finishedListModel->columnCount()-1; i++) {
|
for(int i=0; i<finishedListModel->columnCount()-1; i++) {
|
||||||
if(loaded && ishidden_list.at(i) == "0") {
|
if(loaded && ishidden_list.at(i) == "0") {
|
||||||
finishedList->setColumnHidden(i, true);
|
finishedList->setColumnHidden(i, true);
|
||||||
getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png")));
|
getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_cancel.png")));
|
||||||
} else {
|
} else {
|
||||||
getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png")));
|
getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_ok.png")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return loaded;
|
return loaded;
|
||||||
@@ -608,14 +527,8 @@ QAction* FinishedTorrents::getActionHoSCol(int index) {
|
|||||||
case F_UPSPEED :
|
case F_UPSPEED :
|
||||||
return actionHOSColUpSpeed;
|
return actionHOSColUpSpeed;
|
||||||
break;
|
break;
|
||||||
case F_SWARM :
|
case F_LEECH :
|
||||||
return actionHOSColSwarm;
|
return actionHOSColLeechers;
|
||||||
break;
|
|
||||||
case F_PEERS :
|
|
||||||
return actionHOSColPeers;
|
|
||||||
break;
|
|
||||||
case F_UPLOAD :
|
|
||||||
return actionHOSColUpload;
|
|
||||||
break;
|
break;
|
||||||
case F_RATIO :
|
case F_RATIO :
|
||||||
return actionHOSColRatio;
|
return actionHOSColRatio;
|
||||||
@@ -624,3 +537,94 @@ QAction* FinishedTorrents::getActionHoSCol(int index) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Sorting functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
void FinishedTorrents::toggleFinishedListSortOrder(int index) {
|
||||||
|
Qt::SortOrder sortOrder = Qt::AscendingOrder;
|
||||||
|
if(finishedList->header()->sortIndicatorSection() == index){
|
||||||
|
sortOrder = (Qt::SortOrder)!(bool)finishedList->header()->sortIndicatorOrder();
|
||||||
|
}
|
||||||
|
switch(index) {
|
||||||
|
case F_SIZE:
|
||||||
|
case F_UPSPEED:
|
||||||
|
case F_RATIO:
|
||||||
|
sortFinishedListFloat(index, sortOrder);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sortFinishedListString(index, sortOrder);
|
||||||
|
}
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
QString sortOrderLetter;
|
||||||
|
if(sortOrder == Qt::AscendingOrder)
|
||||||
|
sortOrderLetter = QString::fromUtf8("a");
|
||||||
|
else
|
||||||
|
sortOrderLetter = QString::fromUtf8("d");
|
||||||
|
settings.setValue(QString::fromUtf8("FinishedListSortedCol"), misc::toQString(index)+sortOrderLetter);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::sortFinishedList(int index, Qt::SortOrder sortOrder){
|
||||||
|
if(index == -1) {
|
||||||
|
index = finishedList->header()->sortIndicatorSection();
|
||||||
|
sortOrder = finishedList->header()->sortIndicatorOrder();
|
||||||
|
} else {
|
||||||
|
finishedList->header()->setSortIndicator(index, sortOrder);
|
||||||
|
}
|
||||||
|
switch(index) {
|
||||||
|
case F_SIZE:
|
||||||
|
case F_UPSPEED:
|
||||||
|
sortFinishedListFloat(index, sortOrder);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sortFinishedListString(index, sortOrder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::sortFinishedListFloat(int index, Qt::SortOrder sortOrder){
|
||||||
|
QList<QPair<int, double> > lines;
|
||||||
|
// insertion sorting
|
||||||
|
unsigned int nbRows = finishedListModel->rowCount();
|
||||||
|
for(unsigned int i=0; i<nbRows; ++i){
|
||||||
|
misc::insertSort(lines, QPair<int,double>(i, finishedListModel->data(finishedListModel->index(i, index)).toDouble()), sortOrder);
|
||||||
|
}
|
||||||
|
// Insert items in new model, in correct order
|
||||||
|
unsigned int nbRows_old = lines.size();
|
||||||
|
for(unsigned int row=0; row<nbRows_old; ++row){
|
||||||
|
finishedListModel->insertRow(finishedListModel->rowCount());
|
||||||
|
unsigned int sourceRow = lines[row].first;
|
||||||
|
unsigned int nbColumns = finishedListModel->columnCount();
|
||||||
|
for(unsigned int col=0; col<nbColumns; ++col){
|
||||||
|
finishedListModel->setData(finishedListModel->index(nbRows_old+row, col), finishedListModel->data(finishedListModel->index(sourceRow, col)));
|
||||||
|
finishedListModel->setData(finishedListModel->index(nbRows_old+row, col), finishedListModel->data(finishedListModel->index(sourceRow, col), Qt::DecorationRole), Qt::DecorationRole);
|
||||||
|
finishedListModel->setData(finishedListModel->index(nbRows_old+row, col), finishedListModel->data(finishedListModel->index(sourceRow, col), Qt::ForegroundRole), Qt::ForegroundRole);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Remove old rows
|
||||||
|
finishedListModel->removeRows(0, nbRows_old);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FinishedTorrents::sortFinishedListString(int index, Qt::SortOrder sortOrder){
|
||||||
|
QList<QPair<int, QString> > lines;
|
||||||
|
// Insertion sorting
|
||||||
|
unsigned int nbRows = finishedListModel->rowCount();
|
||||||
|
for(unsigned int i=0; i<nbRows; ++i){
|
||||||
|
misc::insertSortString(lines, QPair<int, QString>(i, finishedListModel->data(finishedListModel->index(i, index)).toString()), sortOrder);
|
||||||
|
}
|
||||||
|
// Insert items in new model, in correct order
|
||||||
|
unsigned int nbRows_old = lines.size();
|
||||||
|
for(unsigned int row=0; row<nbRows_old; ++row){
|
||||||
|
finishedListModel->insertRow(finishedListModel->rowCount());
|
||||||
|
unsigned int sourceRow = lines[row].first;
|
||||||
|
unsigned int nbColumns = finishedListModel->columnCount();
|
||||||
|
for(unsigned int col=0; col<nbColumns; ++col){
|
||||||
|
finishedListModel->setData(finishedListModel->index(nbRows_old+row, col), finishedListModel->data(finishedListModel->index(sourceRow, col)));
|
||||||
|
finishedListModel->setData(finishedListModel->index(nbRows_old+row, col), finishedListModel->data(finishedListModel->index(sourceRow, col), Qt::DecorationRole), Qt::DecorationRole);
|
||||||
|
finishedListModel->setData(finishedListModel->index(nbRows_old+row, col), finishedListModel->data(finishedListModel->index(sourceRow, col), Qt::ForegroundRole), Qt::ForegroundRole);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Remove old rows
|
||||||
|
finishedListModel->removeRows(0, nbRows_old);
|
||||||
|
}
|
||||||
|
|||||||
@@ -35,7 +35,6 @@
|
|||||||
#include "qtorrenthandle.h"
|
#include "qtorrenthandle.h"
|
||||||
|
|
||||||
class QStandardItemModel;
|
class QStandardItemModel;
|
||||||
class QSortFilterProxyModel;
|
|
||||||
class bittorrent;
|
class bittorrent;
|
||||||
class FinishedListDelegate;
|
class FinishedListDelegate;
|
||||||
|
|
||||||
@@ -48,7 +47,6 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
|
|||||||
bittorrent *BTSession;
|
bittorrent *BTSession;
|
||||||
FinishedListDelegate *finishedListDelegate;
|
FinishedListDelegate *finishedListDelegate;
|
||||||
QStandardItemModel *finishedListModel;
|
QStandardItemModel *finishedListModel;
|
||||||
QSortFilterProxyModel *proxyModel;
|
|
||||||
unsigned int nbFinished;
|
unsigned int nbFinished;
|
||||||
void hideOrShowColumn(int index);
|
void hideOrShowColumn(int index);
|
||||||
bool loadHiddenColumns();
|
bool loadHiddenColumns();
|
||||||
@@ -71,15 +69,17 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
|
|||||||
void displayFinishedHoSMenu(const QPoint&);
|
void displayFinishedHoSMenu(const QPoint&);
|
||||||
void setRowColor(int row, QString color);
|
void setRowColor(int row, QString color);
|
||||||
void saveColWidthFinishedList() const;
|
void saveColWidthFinishedList() const;
|
||||||
|
void toggleFinishedListSortOrder(int index);
|
||||||
|
void sortFinishedList(int index=-1, Qt::SortOrder sortOrder=Qt::AscendingOrder);
|
||||||
|
void sortFinishedListFloat(int index, Qt::SortOrder sortOrder);
|
||||||
|
void sortFinishedListString(int index, Qt::SortOrder sortOrder);
|
||||||
void updateFileSize(QString hash);
|
void updateFileSize(QString hash);
|
||||||
void on_actionSet_upload_limit_triggered();
|
void on_actionSet_upload_limit_triggered();
|
||||||
void notifyTorrentDoubleClicked(const QModelIndex& index);
|
void notifyTorrentDoubleClicked(const QModelIndex& index);
|
||||||
void hideOrShowColumnName();
|
void hideOrShowColumnName();
|
||||||
void hideOrShowColumnSize();
|
void hideOrShowColumnSize();
|
||||||
void hideOrShowColumnUpSpeed();
|
void hideOrShowColumnUpSpeed();
|
||||||
void hideOrShowColumnSwarm();
|
void hideOrShowColumnLeechers();
|
||||||
void hideOrShowColumnPeers();
|
|
||||||
void hideOrShowColumnUpload();
|
|
||||||
void hideOrShowColumnRatio();
|
void hideOrShowColumnRatio();
|
||||||
void forceRecheck();
|
void forceRecheck();
|
||||||
|
|
||||||
@@ -91,8 +91,6 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
|
|||||||
void deleteTorrent(QString hash);
|
void deleteTorrent(QString hash);
|
||||||
void showPropertiesFromHash(QString hash);
|
void showPropertiesFromHash(QString hash);
|
||||||
void loadLastSortedColumn();
|
void loadLastSortedColumn();
|
||||||
void saveLastSortedColumn();
|
|
||||||
void updateMetadata(QTorrentHandle &h);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void torrentMovedFromFinishedList(QString);
|
void torrentMovedFromFinishedList(QString);
|
||||||
|
|||||||
2414
src/GUI.cpp
@@ -70,7 +70,6 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
// Bittorrent
|
// Bittorrent
|
||||||
bittorrent *BTSession;
|
bittorrent *BTSession;
|
||||||
QTimer *checkConnect;
|
QTimer *checkConnect;
|
||||||
QTimer *scrapeTimer;
|
|
||||||
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers;
|
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers;
|
||||||
// GUI related
|
// GUI related
|
||||||
QTabWidget *tabs;
|
QTabWidget *tabs;
|
||||||
@@ -140,10 +139,9 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
void createTrayIcon();
|
void createTrayIcon();
|
||||||
void updateUnfinishedTorrentNumber(unsigned int nb);
|
void updateUnfinishedTorrentNumber(unsigned int nb);
|
||||||
void updateFinishedTorrentNumber(unsigned int nb);
|
void updateFinishedTorrentNumber(unsigned int nb);
|
||||||
void fullDiskError(QTorrentHandle& h, QString msg) const;
|
void fullDiskError(QTorrentHandle& h) const;
|
||||||
void handleDownloadFromUrlFailure(QString, QString) const;
|
void handleDownloadFromUrlFailure(QString, QString) const;
|
||||||
void createSystrayDelayed();
|
void createSystrayDelayed();
|
||||||
void setPaused(QTorrentHandle &h) const;
|
|
||||||
// Keyboard shortcuts
|
// Keyboard shortcuts
|
||||||
void createKeyboardShortcuts();
|
void createKeyboardShortcuts();
|
||||||
void displayDownTab() const;
|
void displayDownTab() const;
|
||||||
@@ -179,7 +177,6 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
bool initWebUi(QString username, QString password, int port);
|
bool initWebUi(QString username, QString password, int port);
|
||||||
void on_actionIncreasePriority_triggered();
|
void on_actionIncreasePriority_triggered();
|
||||||
void on_actionDecreasePriority_triggered();
|
void on_actionDecreasePriority_triggered();
|
||||||
void scrapeTrackers();
|
|
||||||
// Options slots
|
// Options slots
|
||||||
void on_actionOptions_triggered();
|
void on_actionOptions_triggered();
|
||||||
void OptionsSaved(bool deleteOptions);
|
void OptionsSaved(bool deleteOptions);
|
||||||
@@ -192,7 +189,6 @@ class GUI : public QMainWindow, private Ui::MainWindow{
|
|||||||
void setTabText(int index, QString text) const;
|
void setTabText(int index, QString text) const;
|
||||||
void openDestinationFolder() const;
|
void openDestinationFolder() const;
|
||||||
void goBuyPage() const;
|
void goBuyPage() const;
|
||||||
void copyMagnetURI() const;
|
|
||||||
void updateRatio();
|
void updateRatio();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|||||||
BIN
src/Icons/add_file.png
Normal file
|
After Width: | Height: | Size: 1005 B |
BIN
src/Icons/add_folder.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/Icons/bt_settings.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
src/Icons/button_cancel.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
src/Icons/button_ok.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
src/Icons/configure.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
src/Icons/connection.png
Normal file
|
After Width: | Height: | Size: 820 B |
BIN
src/Icons/description.png
Normal file
|
After Width: | Height: | Size: 821 B |
BIN
src/Icons/download.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 575 B After Width: | Height: | Size: 575 B |
|
Before Width: | Height: | Size: 750 B After Width: | Height: | Size: 750 B |
|
Before Width: | Height: | Size: 704 B After Width: | Height: | Size: 704 B |
BIN
src/Icons/filter.png
Normal file
|
After Width: | Height: | Size: 998 B |
|
Before Width: | Height: | Size: 449 B After Width: | Height: | Size: 449 B |
BIN
src/Icons/gear.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/Icons/gnome-shutdown.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
src/Icons/home.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/Icons/log.png
Normal file
|
After Width: | Height: | Size: 846 B |
|
Before Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
BIN
src/Icons/money.png
Normal file
|
After Width: | Height: | Size: 813 B |
BIN
src/Icons/newmsg.png
Normal file
|
After Width: | Height: | Size: 532 B |
|
Before Width: | Height: | Size: 743 B |
|
Before Width: | Height: | Size: 659 B |
|
Before Width: | Height: | Size: 796 B |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 733 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 873 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 860 B |
|
Before Width: | Height: | Size: 892 B |
|
Before Width: | Height: | Size: 627 B |
|
Before Width: | Height: | Size: 937 B |
|
Before Width: | Height: | Size: 885 B |
|
Before Width: | Height: | Size: 923 B |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 907 B |
|
Before Width: | Height: | Size: 498 B |
|
Before Width: | Height: | Size: 541 B |
|
Before Width: | Height: | Size: 739 B |
|
Before Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 752 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 813 B |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
BIN
src/Icons/password.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
src/Icons/proxy.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
@@ -1,26 +1,19 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Categories=Qt;Network;P2P;
|
Categories=Qt;Network;P2P
|
||||||
Comment=V1.5.0
|
Comment=V1.3.4
|
||||||
Exec=qbittorrent %f
|
Exec=qbittorrent %f
|
||||||
GenericName=Bittorrent client
|
GenericName=Bittorrent client
|
||||||
GenericName[bg]=Торент клиент
|
GenericName[bg]=Торент клиент
|
||||||
GenericName[cs]=Bittorrent klient
|
|
||||||
GenericName[de]=Bittorren Client
|
GenericName[de]=Bittorren Client
|
||||||
GenericName[el]=Bittorrent πελάτης
|
GenericName[el]=Τορεντ πελάτης
|
||||||
GenericName[es]=Cliente Bittorrent
|
GenericName[es]=Cliente Bittorrent
|
||||||
GenericName[fi]=Bittorrent-ohjelma
|
|
||||||
GenericName[fr]=Client Bittorrent
|
GenericName[fr]=Client Bittorrent
|
||||||
GenericName[hu]=Bittorrent kliens
|
|
||||||
GenericName[it]=Client Bittorrent
|
GenericName[it]=Client Bittorrent
|
||||||
GenericName[ja]=Bittorrent クライアント
|
GenericName[ja]=Bittorrent クライアント
|
||||||
GenericName[ko]=비토렌트 클라이언트
|
GenericName[ko]=비토렌트 클라이언트
|
||||||
GenericName[nl]=Bittorrent client
|
GenericName[nl]=Bittorrent client
|
||||||
GenericName[pl]=Klient Bittorrent
|
GenericName[pl]=Klient Bittorrent
|
||||||
GenericName[pt]=Cliente Bittorrent
|
|
||||||
GenericName[pt_BR]=Cliente Bittorrent
|
|
||||||
GenericName[ro]=Client Bittorrent
|
|
||||||
GenericName[ru]=клиент Bittorrent
|
GenericName[ru]=клиент Bittorrent
|
||||||
GenericName[sk]=Klient siete Bittorrent
|
|
||||||
GenericName[sv]=Bittorrent-klient
|
GenericName[sv]=Bittorrent-klient
|
||||||
GenericName[tr]=Bittorrent istemcisi
|
GenericName[tr]=Bittorrent istemcisi
|
||||||
GenericName[uk]=Bittorrent-клієнт
|
GenericName[uk]=Bittorrent-клієнт
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 965 B After Width: | Height: | Size: 965 B |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
BIN
src/Icons/refresh.png
Normal file
|
After Width: | Height: | Size: 948 B |
BIN
src/Icons/skin/add.png
Normal file
|
After Width: | Height: | Size: 842 B |
0
src/Icons/oxygen/remove.png → src/Icons/skin/remove.png
Executable file → Normal file
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
BIN
src/Icons/skin/search.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
BIN
src/Icons/star.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/Icons/style.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/Icons/subscribe.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
src/Icons/subscribe16.png
Normal file
|
After Width: | Height: | Size: 739 B |
BIN
src/Icons/systemtray.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 856 B After Width: | Height: | Size: 856 B |
BIN
src/Icons/unavailable.png
Normal file
|
After Width: | Height: | Size: 888 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 765 B After Width: | Height: | Size: 765 B |
|
Before Width: | Height: | Size: 722 B After Width: | Height: | Size: 629 B |
BIN
src/Icons/wizard.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
@@ -1,8 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<ui version="4.0" >
|
||||||
<ui version="4.0">
|
|
||||||
<class>MainWindow</class>
|
<class>MainWindow</class>
|
||||||
<widget class="QMainWindow" name="MainWindow">
|
<widget class="QMainWindow" name="MainWindow" >
|
||||||
<property name="geometry">
|
<property name="geometry" >
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
@@ -10,266 +9,263 @@
|
|||||||
<height>563</height>
|
<height>563</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="contextMenuPolicy">
|
<property name="contextMenuPolicy" >
|
||||||
<enum>Qt::CustomContextMenu</enum>
|
<enum>Qt::CustomContextMenu</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle" >
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="centralwidget">
|
<widget class="QWidget" name="centralwidget" >
|
||||||
<layout class="QVBoxLayout"/>
|
<layout class="QVBoxLayout" />
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenuBar" name="menubar">
|
<widget class="QMenuBar" name="menubar" >
|
||||||
<property name="geometry">
|
<property name="geometry" >
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>914</width>
|
<width>914</width>
|
||||||
<height>23</height>
|
<height>26</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menu_Edit">
|
<widget class="QMenu" name="menu_Edit" >
|
||||||
<property name="title">
|
<property name="title" >
|
||||||
<string>&Edit</string>
|
<string>&Edit</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actionStart_All"/>
|
<addaction name="actionStart_All" />
|
||||||
<addaction name="actionPause_All"/>
|
<addaction name="actionPause_All" />
|
||||||
<addaction name="separator"/>
|
<addaction name="separator" />
|
||||||
<addaction name="actionStart"/>
|
<addaction name="actionStart" />
|
||||||
<addaction name="actionPause"/>
|
<addaction name="actionPause" />
|
||||||
<addaction name="separator"/>
|
<addaction name="separator" />
|
||||||
<addaction name="actionTorrent_Properties"/>
|
<addaction name="actionTorrent_Properties" />
|
||||||
<addaction name="separator"/>
|
<addaction name="separator" />
|
||||||
<addaction name="actionDelete"/>
|
<addaction name="actionDelete" />
|
||||||
<addaction name="actionDelete_Permanently"/>
|
<addaction name="actionDelete_Permanently" />
|
||||||
<addaction name="actionDecreasePriority"/>
|
<addaction name="actionDecreasePriority" />
|
||||||
<addaction name="actionIncreasePriority"/>
|
<addaction name="actionIncreasePriority" />
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_Help">
|
<widget class="QMenu" name="menu_Help" >
|
||||||
<property name="title">
|
<property name="title" >
|
||||||
<string>&Help</string>
|
<string>&Help</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actionBugReport"/>
|
<addaction name="actionBugReport" />
|
||||||
<addaction name="actionWebsite"/>
|
<addaction name="actionWebsite" />
|
||||||
<addaction name="actionDocumentation"/>
|
<addaction name="actionDocumentation" />
|
||||||
<addaction name="actionAbout"/>
|
<addaction name="actionAbout" />
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_Options">
|
<widget class="QMenu" name="menu_Options" >
|
||||||
<property name="title">
|
<property name="title" >
|
||||||
<string>Options</string>
|
<string>Options</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actionOptions"/>
|
<addaction name="actionOptions" />
|
||||||
<addaction name="actionShow_console"/>
|
<addaction name="actionShow_console" />
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_File">
|
<widget class="QMenu" name="menu_File" >
|
||||||
<property name="title">
|
<property name="title" >
|
||||||
<string>&File</string>
|
<string>&File</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actionOpen"/>
|
<addaction name="actionOpen" />
|
||||||
<addaction name="actionDownload_from_URL"/>
|
<addaction name="actionDownload_from_URL" />
|
||||||
<addaction name="actionCreate_torrent"/>
|
<addaction name="actionCreate_torrent" />
|
||||||
<addaction name="actionExit"/>
|
<addaction name="actionExit" />
|
||||||
</widget>
|
</widget>
|
||||||
<addaction name="menu_File"/>
|
<addaction name="menu_File" />
|
||||||
<addaction name="menu_Edit"/>
|
<addaction name="menu_Edit" />
|
||||||
<addaction name="menu_Options"/>
|
<addaction name="menu_Options" />
|
||||||
<addaction name="menu_Help"/>
|
<addaction name="menu_Help" />
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QToolBar" name="toolBar">
|
<widget class="QToolBar" name="toolBar" >
|
||||||
<property name="enabled">
|
<property name="enabled" >
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="contextMenuPolicy">
|
<property name="contextMenuPolicy" >
|
||||||
<enum>Qt::NoContextMenu</enum>
|
<enum>Qt::NoContextMenu</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="movable">
|
<property name="movable" >
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="iconSize">
|
<property name="iconSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>32</width>
|
<width>32</width>
|
||||||
<height>32</height>
|
<height>32</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="floatable">
|
<property name="floatable" >
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
<attribute name="toolBarArea">
|
<attribute name="toolBarArea" >
|
||||||
<enum>TopToolBarArea</enum>
|
<enum>TopToolBarArea</enum>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="toolBarBreak">
|
<attribute name="toolBarBreak" >
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</attribute>
|
</attribute>
|
||||||
<addaction name="actionOpen"/>
|
<addaction name="actionOpen" />
|
||||||
<addaction name="actionDownload_from_URL"/>
|
<addaction name="actionDownload_from_URL" />
|
||||||
<addaction name="separator"/>
|
<addaction name="separator" />
|
||||||
<addaction name="actionDelete"/>
|
<addaction name="actionDelete" />
|
||||||
<addaction name="actionDelete_Permanently"/>
|
<addaction name="actionDelete_Permanently" />
|
||||||
<addaction name="separator"/>
|
<addaction name="separator" />
|
||||||
<addaction name="actionTorrent_Properties"/>
|
<addaction name="actionTorrent_Properties" />
|
||||||
<addaction name="separator"/>
|
<addaction name="separator" />
|
||||||
<addaction name="actionStart"/>
|
<addaction name="actionStart" />
|
||||||
<addaction name="actionPause"/>
|
<addaction name="actionPause" />
|
||||||
<addaction name="separator"/>
|
<addaction name="separator" />
|
||||||
<addaction name="actionStart_All"/>
|
<addaction name="actionStart_All" />
|
||||||
<addaction name="actionPause_All"/>
|
<addaction name="actionPause_All" />
|
||||||
<addaction name="separator"/>
|
<addaction name="separator" />
|
||||||
<addaction name="actionOptions"/>
|
<addaction name="actionOptions" />
|
||||||
<addaction name="actionDecreasePriority"/>
|
<addaction name="actionDecreasePriority" />
|
||||||
<addaction name="actionIncreasePriority"/>
|
<addaction name="actionIncreasePriority" />
|
||||||
<addaction name="separator"/>
|
<addaction name="separator" />
|
||||||
<addaction name="actionExit"/>
|
<addaction name="actionExit" />
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QStatusBar" name="statusBar"/>
|
<widget class="QStatusBar" name="statusBar" />
|
||||||
<action name="actionOpen">
|
<action name="actionOpen" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Open</string>
|
<string>Open</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionExit">
|
<action name="actionExit" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Exit</string>
|
<string>Exit</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionOptions">
|
<action name="actionOptions" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Preferences</string>
|
<string>Preferences</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionAbout">
|
<action name="actionAbout" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>About</string>
|
<string>About</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionStart">
|
<action name="actionStart" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Start</string>
|
<string>Start</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionPause">
|
<action name="actionPause" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Pause</string>
|
<string>Pause</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionDelete">
|
<action name="actionDelete" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Delete</string>
|
<string>Delete</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionPause_All">
|
<action name="actionPause_All" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Pause All</string>
|
<string>Pause All</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionStart_All">
|
<action name="actionStart_All" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Start All</string>
|
<string>Start All</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionWebsite">
|
<action name="actionWebsite" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Visit website</string>
|
<string>Visit website</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionDelete_Permanently">
|
<action name="actionDelete_Permanently" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Delete Permanently</string>
|
<string>Delete Permanently</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionTorrent_Properties">
|
<action name="actionTorrent_Properties" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Torrent Properties</string>
|
<string>Torrent Properties</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionDownload_from_URL">
|
<action name="actionDownload_from_URL" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Download from URL</string>
|
<string>Download from URL</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionCreate_torrent">
|
<action name="actionCreate_torrent" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Create torrent</string>
|
<string>Create torrent</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionPreview_file">
|
<action name="actionPreview_file" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Preview file</string>
|
<string>Preview file</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionClearLog">
|
<action name="actionClearLog" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Clear log</string>
|
<string>Clear log</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionBugReport">
|
<action name="actionBugReport" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Report a bug</string>
|
<string>Report a bug</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionSet_upload_limit">
|
<action name="actionSet_upload_limit" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Set upload limit</string>
|
<string>Set upload limit</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionSet_download_limit">
|
<action name="actionSet_download_limit" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Set download limit</string>
|
<string>Set download limit</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionDocumentation">
|
<action name="actionDocumentation" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Documentation</string>
|
<string>Documentation</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionSet_global_download_limit">
|
<action name="actionSet_global_download_limit" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Set global download limit</string>
|
<string>Set global download limit</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionSet_global_upload_limit">
|
<action name="actionSet_global_upload_limit" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Set global upload limit</string>
|
<string>Set global upload limit</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionDecreasePriority">
|
<action name="actionDecreasePriority" >
|
||||||
<property name="icon">
|
<property name="icon" >
|
||||||
<iconset resource="icons.qrc">
|
<iconset resource="icons.qrc" >:/Icons/skin/decrease.png</iconset>
|
||||||
<normaloff>:/Icons/skin/decrease.png</normaloff>:/Icons/skin/decrease.png</iconset>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Decrease priority</string>
|
<string>Decrease priority</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="visible">
|
<property name="visible" >
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionIncreasePriority">
|
<action name="actionIncreasePriority" >
|
||||||
<property name="icon">
|
<property name="icon" >
|
||||||
<iconset resource="icons.qrc">
|
<iconset resource="icons.qrc" >:/Icons/skin/increase.png</iconset>
|
||||||
<normaloff>:/Icons/skin/increase.png</normaloff>:/Icons/skin/increase.png</iconset>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Increase priority</string>
|
<string>Increase priority</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="visible">
|
<property name="visible" >
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionShow_console">
|
<action name="actionShow_console" >
|
||||||
<property name="icon">
|
<property name="icon" >
|
||||||
<iconset resource="icons.qrc">
|
<iconset resource="icons.qrc" >:/Icons/log.png</iconset>
|
||||||
<normaloff>:/Icons/oxygen/log.png</normaloff>:/Icons/oxygen/log.png</iconset>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Console</string>
|
<string>Console</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="icons.qrc"/>
|
<include location="icons.qrc" />
|
||||||
</resources>
|
</resources>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|||||||
@@ -33,7 +33,6 @@
|
|||||||
#include <QStandardItemModel>
|
#include <QStandardItemModel>
|
||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QSortFilterProxyModel>
|
|
||||||
|
|
||||||
#include "SearchTab.h"
|
#include "SearchTab.h"
|
||||||
#include "SearchListDelegate.h"
|
#include "SearchListDelegate.h"
|
||||||
@@ -46,104 +45,155 @@
|
|||||||
#define SEARCH_LEECHERS 3
|
#define SEARCH_LEECHERS 3
|
||||||
#define SEARCH_ENGINE 4
|
#define SEARCH_ENGINE 4
|
||||||
|
|
||||||
SearchTab::SearchTab(SearchEngine *parent) : QWidget(), parent(parent)
|
SearchTab::SearchTab(SearchEngine *parent) : QWidget()
|
||||||
{
|
{
|
||||||
box=new QVBoxLayout();
|
box=new QVBoxLayout();
|
||||||
results_lbl=new QLabel();
|
results_lbl=new QLabel();
|
||||||
resultsBrowser = new QTreeView();
|
resultsBrowser = new QTreeView();
|
||||||
resultsBrowser->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
resultsBrowser->setSelectionMode(QAbstractItemView::ExtendedSelection);
|
||||||
box->addWidget(results_lbl);
|
box->addWidget(results_lbl);
|
||||||
box->addWidget(resultsBrowser);
|
box->addWidget(resultsBrowser);
|
||||||
|
|
||||||
setLayout(box);
|
setLayout(box);
|
||||||
// Set Search results list model
|
// Set Search results list model
|
||||||
SearchListModel = new QStandardItemModel(0,6);
|
SearchListModel = new QStandardItemModel(0,6);
|
||||||
SearchListModel->setHeaderData(SEARCH_NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
|
SearchListModel->setHeaderData(SEARCH_NAME, Qt::Horizontal, tr("Name", "i.e: file name"));
|
||||||
SearchListModel->setHeaderData(SEARCH_SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
|
SearchListModel->setHeaderData(SEARCH_SIZE, Qt::Horizontal, tr("Size", "i.e: file size"));
|
||||||
SearchListModel->setHeaderData(SEARCH_SEEDERS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources"));
|
SearchListModel->setHeaderData(SEARCH_SEEDERS, Qt::Horizontal, tr("Seeders", "i.e: Number of full sources"));
|
||||||
SearchListModel->setHeaderData(SEARCH_LEECHERS, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources"));
|
SearchListModel->setHeaderData(SEARCH_LEECHERS, Qt::Horizontal, tr("Leechers", "i.e: Number of partial sources"));
|
||||||
SearchListModel->setHeaderData(SEARCH_ENGINE, Qt::Horizontal, tr("Search engine"));
|
SearchListModel->setHeaderData(SEARCH_ENGINE, Qt::Horizontal, tr("Search engine"));
|
||||||
resultsBrowser->hideColumn(URL_COLUMN); // Hide url column
|
resultsBrowser->setModel(SearchListModel);
|
||||||
|
resultsBrowser->hideColumn(URL_COLUMN); // Hide url column
|
||||||
proxyModel = new QSortFilterProxyModel();
|
SearchDelegate = new SearchListDelegate();
|
||||||
proxyModel->setDynamicSortFilter(true);
|
resultsBrowser->setItemDelegate(SearchDelegate);
|
||||||
proxyModel->setSourceModel(SearchListModel);
|
// Make search list header clickable for sorting
|
||||||
resultsBrowser->setModel(proxyModel);
|
resultsBrowser->header()->setClickable(true);
|
||||||
|
resultsBrowser->header()->setSortIndicatorShown(true);
|
||||||
SearchDelegate = new SearchListDelegate();
|
|
||||||
resultsBrowser->setItemDelegate(SearchDelegate);
|
// Connect signals to slots (search part)
|
||||||
|
connect(resultsBrowser, SIGNAL(doubleClicked(const QModelIndex&)), parent, SLOT(downloadSelectedItem(const QModelIndex&)));
|
||||||
resultsBrowser->setRootIsDecorated(false);
|
connect(resultsBrowser->header(), SIGNAL(sectionPressed(int)), this, SLOT(sortSearchList(int)));
|
||||||
resultsBrowser->setAllColumnsShowFocus(true);
|
|
||||||
resultsBrowser->setSortingEnabled(true);
|
// Load last columns width for search results list
|
||||||
|
if(!loadColWidthSearchList()){
|
||||||
// Connect signals to slots (search part)
|
resultsBrowser->header()->resizeSection(0, 275);
|
||||||
connect(resultsBrowser, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(downloadSelectedItem(const QModelIndex&)));
|
}
|
||||||
|
|
||||||
// Load last columns width for search results list
|
|
||||||
if(!loadColWidthResultsList()){
|
|
||||||
resultsBrowser->header()->resizeSection(0, 275);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sort by Seeds
|
|
||||||
resultsBrowser->sortByColumn(SEEDERS, Qt::DescendingOrder);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SearchTab::downloadSelectedItem(const QModelIndex& index) {
|
SearchTab::~SearchTab()
|
||||||
QString engine_url = proxyModel->data(proxyModel->index(index.row(), ENGINE_URL_COLUMN)).toString();
|
{
|
||||||
QString torrent_url = proxyModel->data(proxyModel->index(index.row(), URL_COLUMN)).toString();
|
saveColWidthSearchList();
|
||||||
setRowColor(index.row(), "red");
|
delete resultsBrowser;
|
||||||
parent->downloadTorrent(engine_url, torrent_url);
|
delete SearchListModel;
|
||||||
}
|
delete SearchDelegate;
|
||||||
|
|
||||||
SearchTab::~SearchTab() {
|
|
||||||
delete box;
|
|
||||||
delete results_lbl;
|
|
||||||
delete resultsBrowser;
|
|
||||||
delete SearchListModel;
|
|
||||||
delete proxyModel;
|
|
||||||
delete SearchDelegate;
|
|
||||||
}
|
|
||||||
|
|
||||||
QHeaderView* SearchTab::header() const {
|
|
||||||
return resultsBrowser->header();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SearchTab::loadColWidthResultsList() {
|
|
||||||
QSettings settings("qBittorrent", "qBittorrent");
|
|
||||||
QString line = settings.value("SearchResultsColsWidth", QString()).toString();
|
|
||||||
if(line.isEmpty())
|
|
||||||
return false;
|
|
||||||
QStringList width_list = line.split(' ');
|
|
||||||
if(width_list.size() < SearchListModel->columnCount())
|
|
||||||
return false;
|
|
||||||
unsigned int listSize = width_list.size();
|
|
||||||
for(unsigned int i=0; i<listSize; ++i){
|
|
||||||
resultsBrowser->header()->resizeSection(i, width_list.at(i).toInt());
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QLabel* SearchTab::getCurrentLabel()
|
QLabel* SearchTab::getCurrentLabel()
|
||||||
{
|
{
|
||||||
return results_lbl;
|
return results_lbl;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTreeView* SearchTab::getCurrentTreeView()
|
QTreeView* SearchTab::getCurrentTreeView()
|
||||||
{
|
{
|
||||||
return resultsBrowser;
|
return resultsBrowser;
|
||||||
}
|
}
|
||||||
|
|
||||||
QStandardItemModel* SearchTab::getCurrentSearchListModel()
|
QStandardItemModel* SearchTab::getCurrentSearchListModel()
|
||||||
{
|
{
|
||||||
return SearchListModel;
|
return SearchListModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the color of a row in data model
|
// Set the color of a row in data model
|
||||||
void SearchTab::setRowColor(int row, QString color){
|
void SearchTab::setRowColor(int row, QString color){
|
||||||
for(int i=0; i<proxyModel->columnCount(); ++i){
|
for(int i=0; i<SearchListModel->columnCount(); ++i){
|
||||||
proxyModel->setData(proxyModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole);
|
SearchListModel->setData(SearchListModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SearchTab::sortSearchList(int index){
|
||||||
|
static Qt::SortOrder sortOrder = Qt::AscendingOrder;
|
||||||
|
if(resultsBrowser->header()->sortIndicatorSection() == index){
|
||||||
|
sortOrder = (sortOrder == Qt::DescendingOrder) ? Qt::AscendingOrder : Qt::DescendingOrder; ;
|
||||||
|
}
|
||||||
|
resultsBrowser->header()->setSortIndicator(index, sortOrder);
|
||||||
|
switch(index){
|
||||||
|
case SEEDERS:
|
||||||
|
case LEECHERS:
|
||||||
|
case SIZE:
|
||||||
|
sortSearchListInt(index, sortOrder);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sortSearchListString(index, sortOrder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SearchTab::sortSearchListInt(int index, Qt::SortOrder sortOrder){
|
||||||
|
QList<QPair<int, qlonglong> > lines;
|
||||||
|
// Insertion sorting
|
||||||
|
for(int i=0; i<SearchListModel->rowCount(); ++i){
|
||||||
|
misc::insertSort(lines, QPair<int,qlonglong>(i, SearchListModel->data(SearchListModel->index(i, index)).toLongLong()), sortOrder);
|
||||||
|
}
|
||||||
|
// Insert items in new model, in correct order
|
||||||
|
int nbRows_old = lines.size();
|
||||||
|
for(int row=0; row<lines.size(); ++row){
|
||||||
|
SearchListModel->insertRow(SearchListModel->rowCount());
|
||||||
|
int sourceRow = lines[row].first;
|
||||||
|
for(int col=0; col<6; ++col){
|
||||||
|
SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col)));
|
||||||
|
SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col), Qt::ForegroundRole), Qt::ForegroundRole);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Remove old rows
|
||||||
|
SearchListModel->removeRows(0, nbRows_old);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SearchTab::sortSearchListString(int index, Qt::SortOrder sortOrder){
|
||||||
|
QList<QPair<int, QString> > lines;
|
||||||
|
// Insetion sorting
|
||||||
|
for(int i=0; i<SearchListModel->rowCount(); ++i){
|
||||||
|
misc::insertSortString(lines, QPair<int, QString>(i, SearchListModel->data(SearchListModel->index(i, index)).toString()), sortOrder);
|
||||||
|
}
|
||||||
|
// Insert items in new model, in correct order
|
||||||
|
int nbRows_old = lines.size();
|
||||||
|
for(int row=0; row<nbRows_old; ++row){
|
||||||
|
SearchListModel->insertRow(SearchListModel->rowCount());
|
||||||
|
int sourceRow = lines[row].first;
|
||||||
|
for(int col=0; col<6; ++col){
|
||||||
|
SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col)));
|
||||||
|
SearchListModel->setData(SearchListModel->index(nbRows_old+row, col), SearchListModel->data(SearchListModel->index(sourceRow, col), Qt::ForegroundRole), Qt::ForegroundRole);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Remove old rows
|
||||||
|
SearchListModel->removeRows(0, nbRows_old);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save columns width in a file to remember them
|
||||||
|
// (download list)
|
||||||
|
void SearchTab::saveColWidthSearchList() const{
|
||||||
|
qDebug("Saving columns width in search list");
|
||||||
|
QSettings settings("qBittorrent", "qBittorrent");
|
||||||
|
QStringList width_list;
|
||||||
|
for(int i=0; i<SearchListModel->columnCount(); ++i){
|
||||||
|
width_list << misc::toQString(resultsBrowser->columnWidth(i));
|
||||||
|
}
|
||||||
|
settings.setValue("SearchListColsWidth", width_list.join(" "));
|
||||||
|
qDebug("Search list columns width saved");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load columns width in a file that were saved previously
|
||||||
|
// (search list)
|
||||||
|
bool SearchTab::loadColWidthSearchList(){
|
||||||
|
qDebug("Loading columns width for search list");
|
||||||
|
QSettings settings("qBittorrent", "qBittorrent");
|
||||||
|
QString line = settings.value("SearchListColsWidth", QString()).toString();
|
||||||
|
if(line.isEmpty())
|
||||||
|
return false;
|
||||||
|
QStringList width_list = line.split(' ');
|
||||||
|
if(width_list.size() != SearchListModel->columnCount())
|
||||||
|
return false;
|
||||||
|
for(int i=0; i<width_list.size(); ++i){
|
||||||
|
resultsBrowser->header()->resizeSection(i, width_list.at(i).toInt());
|
||||||
|
}
|
||||||
|
qDebug("Search list columns width loaded");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|||||||
@@ -39,36 +39,32 @@
|
|||||||
class SearchListDelegate;
|
class SearchListDelegate;
|
||||||
class SearchEngine;
|
class SearchEngine;
|
||||||
class QTreeView;
|
class QTreeView;
|
||||||
class QHeaderView;
|
|
||||||
class QStandardItemModel;
|
class QStandardItemModel;
|
||||||
class QSortFilterProxyModel;
|
|
||||||
|
|
||||||
class SearchTab: public QWidget, public Ui::search_engine {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
private:
|
|
||||||
QVBoxLayout *box;
|
|
||||||
QLabel *results_lbl;
|
|
||||||
QTreeView *resultsBrowser;
|
|
||||||
QStandardItemModel *SearchListModel;
|
|
||||||
QSortFilterProxyModel *proxyModel;
|
|
||||||
SearchListDelegate *SearchDelegate;
|
|
||||||
SearchEngine *parent;
|
|
||||||
|
|
||||||
protected slots:
|
|
||||||
void downloadSelectedItem(const QModelIndex& index);
|
|
||||||
|
|
||||||
public:
|
|
||||||
SearchTab(SearchEngine *parent);
|
|
||||||
~SearchTab();
|
|
||||||
bool loadColWidthResultsList();
|
|
||||||
QLabel * getCurrentLabel();
|
|
||||||
QStandardItemModel * getCurrentSearchListModel();
|
|
||||||
QTreeView * getCurrentTreeView();
|
|
||||||
void setRowColor(int row, QString color);
|
|
||||||
QHeaderView* header() const;
|
|
||||||
|
|
||||||
|
|
||||||
|
class SearchTab : public QWidget, public Ui::search_engine
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
private:
|
||||||
|
QVBoxLayout *box;
|
||||||
|
QLabel *results_lbl;
|
||||||
|
QTreeView *resultsBrowser;
|
||||||
|
QStandardItemModel *SearchListModel;
|
||||||
|
SearchListDelegate *SearchDelegate;
|
||||||
|
public:
|
||||||
|
SearchTab(SearchEngine *parent);
|
||||||
|
~SearchTab();
|
||||||
|
bool loadColWidthSearchList();
|
||||||
|
QLabel * getCurrentLabel();
|
||||||
|
QStandardItemModel * getCurrentSearchListModel();
|
||||||
|
QTreeView * getCurrentTreeView();
|
||||||
|
void setRowColor(int row, QString color);
|
||||||
|
protected slots:
|
||||||
|
void sortSearchList(int index);
|
||||||
|
void sortSearchListInt(int index, Qt::SortOrder sortOrder);
|
||||||
|
void sortSearchListString(int index, Qt::SortOrder sortOrder);
|
||||||
|
void saveColWidthSearchList() const;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
224
src/about.ui
@@ -1,9 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<ui version="4.0" >
|
||||||
<ui version="4.0">
|
|
||||||
<author>Christophe Dumez</author>
|
<author>Christophe Dumez</author>
|
||||||
<class>AboutDlg</class>
|
<class>AboutDlg</class>
|
||||||
<widget class="QDialog" name="AboutDlg">
|
<widget class="QDialog" name="AboutDlg" >
|
||||||
<property name="geometry">
|
<property name="geometry" >
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
@@ -11,65 +10,65 @@
|
|||||||
<height>320</height>
|
<height>320</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimumSize">
|
<property name="minimumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>504</width>
|
<width>504</width>
|
||||||
<height>320</height>
|
<height>320</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>504</width>
|
<width>504</width>
|
||||||
<height>320</height>
|
<height>320</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle" >
|
||||||
<string>About qBittorrent</string>
|
<string>About qBittorrent</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="logo">
|
<widget class="QLabel" name="logo" >
|
||||||
<property name="minimumSize">
|
<property name="minimumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>22</width>
|
<width>22</width>
|
||||||
<height>22</height>
|
<height>22</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>22</width>
|
<width>22</width>
|
||||||
<height>22</height>
|
<height>22</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="lb_name">
|
<widget class="QLabel" name="lb_name" >
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy" >
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string><h3><b>qBittorrent</b></h3></string>
|
<string><h3><b>qBittorrent</b></h3></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="textFormat">
|
<property name="textFormat" >
|
||||||
<enum>Qt::RichText</enum>
|
<enum>Qt::RichText</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>40</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -80,90 +79,79 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTabWidget" name="tw_tabs">
|
<widget class="QTabWidget" name="tw_tabs" >
|
||||||
<property name="currentIndex">
|
<property name="currentIndex" >
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="tab2">
|
<widget class="QWidget" name="tab2" >
|
||||||
<attribute name="title">
|
<attribute name="title" >
|
||||||
<string>About</string>
|
<string>About</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<widget class="QLabel" name="mascot_lbl">
|
<widget class="QLabel" name="mascot_lbl" >
|
||||||
<property name="geometry">
|
<property name="geometry" >
|
||||||
<rect>
|
<rect>
|
||||||
<x>380</x>
|
<x>380</x>
|
||||||
<y>70</y>
|
<y>50</y>
|
||||||
<width>94</width>
|
<width>94</width>
|
||||||
<height>162</height>
|
<height>162</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QLabel" name="lb_about">
|
<widget class="QLabel" name="lb_about" >
|
||||||
<property name="geometry">
|
<property name="geometry" >
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>30</y>
|
<y>40</y>
|
||||||
<width>481</width>
|
<width>481</width>
|
||||||
<height>102</height>
|
<height>102</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy" >
|
||||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
<verstretch>0</verstretch>
|
<verstretch>0</verstretch>
|
||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
<string>A bittorrent client using Qt4 and libtorrent, programmed in C++.<br>
|
||||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
<br>
|
||||||
p, li { white-space: pre-wrap; }
|
Copyright © 2006 by Christophe Dumez<br>
|
||||||
</style></head><body style=" font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;">
|
<br> <u>Home Page:</u> <i>http://www.qbittorrent.org</i><br></string>
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A Bittorrent client programmed in C++, based on Qt4 toolkit </p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">and libtorrent-rasterbar. <br /><br />Copyright ©2006-2009 Christophe Dumez<br /><br /><span style=" text-decoration: underline;">Home Page:</span> <a href="http://www.qbittorrent.org"><span style=" text-decoration: underline; color:#0057ae;">http://www.qbittorrent.org</span></a><br /></p></body></html></string>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="textFormat">
|
<property name="textFormat" >
|
||||||
<enum>Qt::RichText</enum>
|
<enum>Qt::RichText</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="scaledContents">
|
<property name="alignment" >
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignCenter</set>
|
<set>Qt::AlignCenter</set>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="openExternalLinks">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tab3">
|
<widget class="QWidget" name="tab3" >
|
||||||
<attribute name="title">
|
<attribute name="title" >
|
||||||
<string>Author</string>
|
<string>Author</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QFrame" name="te_authors">
|
<widget class="QFrame" name="te_authors" >
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeType">
|
<property name="sizeType" >
|
||||||
<enum>QSizePolicy::Preferred</enum>
|
<enum>QSizePolicy::Preferred</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -172,13 +160,13 @@ p, li { white-space: pre-wrap; }
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_3" >
|
||||||
<property name="font">
|
<property name="font" >
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -189,14 +177,14 @@ p, li { white-space: pre-wrap; }
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Name:</string>
|
<string>Name:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_4">
|
<widget class="QLabel" name="label_4" >
|
||||||
<property name="font">
|
<property name="font" >
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -207,14 +195,14 @@ p, li { white-space: pre-wrap; }
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Country:</string>
|
<string>Country:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="lbl_birthday">
|
<widget class="QLabel" name="lbl_birthday" >
|
||||||
<property name="font">
|
<property name="font" >
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -225,14 +213,14 @@ p, li { white-space: pre-wrap; }
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Birthday:</string>
|
<string>Birthday:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="lbl_occupation">
|
<widget class="QLabel" name="lbl_occupation" >
|
||||||
<property name="font">
|
<property name="font" >
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -243,14 +231,14 @@ p, li { white-space: pre-wrap; }
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Occupation:</string>
|
<string>Occupation:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_5">
|
<widget class="QLabel" name="label_5" >
|
||||||
<property name="font">
|
<property name="font" >
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -261,14 +249,14 @@ p, li { white-space: pre-wrap; }
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>E-mail:</string>
|
<string>E-mail:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_8">
|
<widget class="QLabel" name="label_8" >
|
||||||
<property name="font">
|
<property name="font" >
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -279,7 +267,7 @@ p, li { white-space: pre-wrap; }
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Home page:</string>
|
<string>Home page:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -288,13 +276,13 @@ p, li { white-space: pre-wrap; }
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeType">
|
<property name="sizeType" >
|
||||||
<enum>QSizePolicy::Preferred</enum>
|
<enum>QSizePolicy::Preferred</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -303,48 +291,48 @@ p, li { white-space: pre-wrap; }
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Christophe Dumez</string>
|
<string>Christophe Dumez</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_7">
|
<widget class="QLabel" name="label_7" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>France</string>
|
<string>France</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_11">
|
<widget class="QLabel" name="label_11" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>03/05/1985</string>
|
<string>03/05/1985</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_10">
|
<widget class="QLabel" name="label_10" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Student in computer science</string>
|
<string>Student in computer science</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_6">
|
<widget class="QLabel" name="label_6" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>chris@qbittorrent.org</string>
|
<string>chris@qbittorrent.org</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_9">
|
<widget class="QLabel" name="label_9" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>http://www.dchris.eu</string>
|
<string>http://www.dchris.eu</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -353,10 +341,10 @@ p, li { white-space: pre-wrap; }
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>40</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -369,46 +357,46 @@ p, li { white-space: pre-wrap; }
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tab4">
|
<widget class="QWidget" name="tab4" >
|
||||||
<attribute name="title">
|
<attribute name="title" >
|
||||||
<string>Thanks to</string>
|
<string>Thanks to</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTextBrowser" name="te_thanks"/>
|
<widget class="QTextBrowser" name="te_thanks" />
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tab5">
|
<widget class="QWidget" name="tab5" >
|
||||||
<attribute name="title">
|
<attribute name="title" >
|
||||||
<string>Translation</string>
|
<string>Translation</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTextBrowser" name="te_translation">
|
<widget class="QTextBrowser" name="te_translation" >
|
||||||
<property name="lineWrapMode">
|
<property name="lineWrapMode" >
|
||||||
<enum>QTextEdit::NoWrap</enum>
|
<enum>QTextEdit::NoWrap</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="tab1">
|
<widget class="QWidget" name="tab1" >
|
||||||
<attribute name="title">
|
<attribute name="title" >
|
||||||
<string>License</string>
|
<string>License</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTextBrowser" name="te_license"/>
|
<widget class="QTextBrowser" name="te_license" />
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -416,7 +404,7 @@ p, li { white-space: pre-wrap; }
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11"/>
|
<layoutdefault spacing="6" margin="11" />
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|||||||
@@ -46,8 +46,8 @@ class about : public QDialog, private Ui::AboutDlg{
|
|||||||
setupUi(this);
|
setupUi(this);
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
// Set icons
|
// Set icons
|
||||||
logo->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/qbittorrent22.png")));
|
logo->setPixmap(QPixmap(QString::fromUtf8(":/Icons/qbittorrent22.png")));
|
||||||
mascot_lbl->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/mascot.png")));
|
mascot_lbl->setPixmap(QPixmap(QString::fromUtf8(":/Icons/mascot.png")));
|
||||||
//Title
|
//Title
|
||||||
lb_name->setText(QString::fromUtf8("<b><h1>")+tr("qBittorrent")+QString::fromUtf8(" "VERSION"</h1></b>"));
|
lb_name->setText(QString::fromUtf8("<b><h1>")+tr("qBittorrent")+QString::fromUtf8(" "VERSION"</h1></b>"));
|
||||||
// Thanks
|
// Thanks
|
||||||
@@ -91,19 +91,7 @@ class about : public QDialog, private Ui::AboutDlg{
|
|||||||
te_translation->scrollToAnchor(QString::fromUtf8("top"));
|
te_translation->scrollToAnchor(QString::fromUtf8("top"));
|
||||||
// License
|
// License
|
||||||
te_license->append(QString::fromUtf8("<a name='top'></a>"));
|
te_license->append(QString::fromUtf8("<a name='top'></a>"));
|
||||||
te_license->append(QString::fromUtf8("qBittorrent is licensed under the GNU General Public License version 2 with the\
|
te_license->append(QString::fromUtf8("<center><b>GNU GENERAL PUBLIC LICENSE</b></center><br>\
|
||||||
addition of the following special exception:\
|
|
||||||
<br><br>\
|
|
||||||
<i>In addition, as a special exception, the copyright holders give permission to\
|
|
||||||
link this program with the OpenSSL project\'s \"OpenSSL\" library (or with\
|
|
||||||
modified versions of it that use the same license as the \"OpenSSL\" library),\
|
|
||||||
and distribute the linked executables. You must obey the GNU General Public\
|
|
||||||
License in all respects for all of the code used other than \"OpenSSL\". If you\
|
|
||||||
modify file(s), you may extend this exception to your version of the file(s),\
|
|
||||||
but you are not obligated to do so. If you do not wish to do so, delete this\
|
|
||||||
exception statement from your version.</i>\
|
|
||||||
<br><br>\
|
|
||||||
<center><b>GNU GENERAL PUBLIC LICENSE</b></center><br>\
|
|
||||||
<center>Version 2, June 1991</center><br>\
|
<center>Version 2, June 1991</center><br>\
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.<br>\
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.<br>\
|
||||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA<br>\
|
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA<br>\
|
||||||
|
|||||||
@@ -1,60 +1,68 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<ui version="4.0" >
|
||||||
<ui version="4.0">
|
|
||||||
<class>addTorrentDialog</class>
|
<class>addTorrentDialog</class>
|
||||||
<widget class="QDialog" name="addTorrentDialog">
|
<widget class="QDialog" name="addTorrentDialog" >
|
||||||
<property name="geometry">
|
<property name="geometry" >
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>511</width>
|
<width>511</width>
|
||||||
<height>461</height>
|
<height>441</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle" >
|
||||||
<string>Torrent addition dialog</string>
|
<string>Torrent addition dialog</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="fileNameLbl">
|
<widget class="QLabel" name="fileNameLbl" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="Line" name="line">
|
<widget class="Line" name="line" >
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="savePathLbl">
|
<widget class="QLabel" name="savePathLbl" >
|
||||||
<property name="font">
|
<property name="font" >
|
||||||
<font>
|
<font>
|
||||||
<weight>75</weight>
|
<weight>75</weight>
|
||||||
<bold>true</bold>
|
<bold>true</bold>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Save path:</string>
|
<string>Save path:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="leftMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin" >
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLineEdit" name="savePathTxt"/>
|
<widget class="QLineEdit" name="savePathTxt" />
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="browseButton">
|
<widget class="QToolButton" name="browseButton" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>...</string>
|
<string>...</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -62,108 +70,39 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<widget class="QLabel" name="torrentContentLbl" >
|
||||||
<item>
|
<property name="font" >
|
||||||
<widget class="QLabel" name="label_2">
|
|
||||||
<property name="text">
|
|
||||||
<string>Torrent size:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="lbl_torrent_size">
|
|
||||||
<property name="text">
|
|
||||||
<string>Unknown</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer_2">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>Free disk space:</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="lbl_disk_space">
|
|
||||||
<property name="text">
|
|
||||||
<string>Unknown</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label_space_msg">
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="torrentContentLbl">
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
<font>
|
||||||
<weight>75</weight>
|
<weight>75</weight>
|
||||||
<bold>true</bold>
|
<bold>true</bold>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Torrent content:</string>
|
<string>Torrent content:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTreeView" name="torrentContentList">
|
<widget class="QTreeView" name="torrentContentList" >
|
||||||
<property name="contextMenuPolicy">
|
<property name="contextMenuPolicy" >
|
||||||
<enum>Qt::CustomContextMenu</enum>
|
<enum>Qt::CustomContextMenu</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="editTriggers">
|
<property name="editTriggers" >
|
||||||
<set>QAbstractItemView::AllEditTriggers</set>
|
<set>QAbstractItemView::AllEditTriggers</set>
|
||||||
</property>
|
</property>
|
||||||
<property name="selectionMode">
|
<property name="selectionMode" >
|
||||||
<enum>QAbstractItemView::ExtendedSelection</enum>
|
<enum>QAbstractItemView::ExtendedSelection</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>40</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -172,25 +111,25 @@
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="collapseAllButton">
|
<widget class="QPushButton" name="collapseAllButton" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Collapse all</string>
|
<string>Collapse all</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="expandAllButton">
|
<widget class="QPushButton" name="expandAllButton" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Expand all</string>
|
<string>Expand all</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>40</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -201,33 +140,42 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="checkIncrementalDL">
|
<widget class="QCheckBox" name="checkIncrementalDL" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Download in sequential order (slower but good for previewing)</string>
|
<string>Download in correct order (slower but good for previewing)</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="addInPause">
|
<widget class="QCheckBox" name="addInPause" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Add to download list in paused state</string>
|
<string>Add to download list in paused state</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="leftMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin" >
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>40</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -236,25 +184,25 @@
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="OkButton">
|
<widget class="QPushButton" name="OkButton" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Add</string>
|
<string>Add</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="CancelButton">
|
<widget class="QPushButton" name="CancelButton" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Cancel</string>
|
<string>Cancel</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>40</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -265,23 +213,23 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
<action name="actionIgnored">
|
<action name="actionIgnored" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Ignored</string>
|
<string>Ignored</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionNormal">
|
<action name="actionNormal" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Normal</string>
|
<string>Normal</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionHigh">
|
<action name="actionHigh" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>High</string>
|
<string>High</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<action name="actionMaximum">
|
<action name="actionMaximum" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Maximum</string>
|
<string>Maximum</string>
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
|
|||||||
@@ -37,234 +37,232 @@
|
|||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
class torrent_file {
|
class torrent_file {
|
||||||
private:
|
private:
|
||||||
torrent_file *parent;
|
torrent_file *parent;
|
||||||
bool is_dir;
|
bool is_dir;
|
||||||
QString rel_path;
|
QString rel_path;
|
||||||
QList<const torrent_file*> children;
|
QList<const torrent_file*> children;
|
||||||
size_type size;
|
size_type size;
|
||||||
float progress;
|
float progress;
|
||||||
int priority;
|
int priority;
|
||||||
int index; // Index in torrent_info
|
int index; // Index in torrent_info
|
||||||
|
|
||||||
public:
|
public:
|
||||||
torrent_file(torrent_file *parent, QString path, bool dir, size_type size=0, int index=-1, float progress=0., int priority=1): parent(parent), is_dir(dir), size(size), progress(progress), priority(priority), index(index){
|
torrent_file(torrent_file *parent, QString path, bool dir, size_type size=0, int index=-1, float progress=0., int priority=1): parent(parent), is_dir(dir), size(size), progress(progress), priority(priority), index(index){
|
||||||
qDebug("created a file with index %d", index);
|
qDebug("created a file with index %d", index);
|
||||||
rel_path = QDir::cleanPath(path);
|
rel_path = QDir::cleanPath(path);
|
||||||
Q_ASSERT(progress >= 0.);
|
if(parent) {
|
||||||
Q_ASSERT(progress <= 1.);
|
parent->updateProgress();
|
||||||
if(parent) {
|
parent->updatePriority(priority);
|
||||||
parent->updateProgress();
|
}
|
||||||
parent->updatePriority(priority);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
~torrent_file() {
|
~torrent_file() {
|
||||||
qDeleteAll(children);
|
qDeleteAll(children);
|
||||||
}
|
|
||||||
|
|
||||||
QString path() const {
|
|
||||||
return rel_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString name() const {
|
|
||||||
return rel_path.split(QDir::separator()).last();
|
|
||||||
}
|
|
||||||
|
|
||||||
void updateProgress() {
|
|
||||||
Q_ASSERT(is_dir);
|
|
||||||
if(children.isEmpty()) {
|
|
||||||
progress = 0.;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
double wanted = 0.;
|
|
||||||
double done = 0.;
|
QString path() const {
|
||||||
foreach(const torrent_file *child, children) {
|
return rel_path;
|
||||||
wanted += child->getSize();
|
|
||||||
done += child->getSize()*child->getProgress();
|
|
||||||
}
|
}
|
||||||
progress = done / wanted;
|
|
||||||
Q_ASSERT(progress >= 0.);
|
|
||||||
Q_ASSERT(progress <= 1.);
|
|
||||||
}
|
|
||||||
|
|
||||||
void updatePriority(int prio) {
|
QString name() const {
|
||||||
Q_ASSERT(is_dir);
|
return rel_path.split(QDir::separator()).last();
|
||||||
foreach(const torrent_file *child, children) {
|
|
||||||
if(child->getPriority() != prio) return;
|
|
||||||
}
|
}
|
||||||
priority = prio;
|
|
||||||
}
|
|
||||||
|
|
||||||
int getPriority() const {
|
void updateProgress() {
|
||||||
return priority;
|
Q_ASSERT(is_dir);
|
||||||
}
|
if(children.isEmpty()) {
|
||||||
|
progress = 0.;
|
||||||
size_type getSize() const {
|
return;
|
||||||
return size;
|
}
|
||||||
}
|
float wanted = 0.;
|
||||||
|
float done = 0.;
|
||||||
float getProgress() const {
|
foreach(const torrent_file *child, children) {
|
||||||
return progress;
|
wanted += child->getSize();
|
||||||
}
|
done += child->getSize()*child->getProgress();
|
||||||
|
}
|
||||||
int getIndex() const {
|
progress = done / wanted;
|
||||||
return index;
|
Q_ASSERT(progress >= 0.);
|
||||||
}
|
Q_ASSERT(progress <= 1.);
|
||||||
|
|
||||||
bool isDir() const {
|
|
||||||
return is_dir;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasChildren() const {
|
|
||||||
return (!children.isEmpty());
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<const torrent_file*> getChildren() const {
|
|
||||||
return children;
|
|
||||||
}
|
|
||||||
|
|
||||||
const torrent_file* getChild(QString fileName) const {
|
|
||||||
Q_ASSERT(is_dir);
|
|
||||||
foreach(const torrent_file *f, children) {
|
|
||||||
if(f->name() == fileName) return f;
|
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void addBytes(size_type b) {
|
void updatePriority(int prio) {
|
||||||
size += b;
|
Q_ASSERT(is_dir);
|
||||||
if(parent)
|
foreach(const torrent_file *child, children) {
|
||||||
parent->addBytes(b);
|
if(child->getPriority() != prio) return;
|
||||||
}
|
}
|
||||||
|
priority = prio;
|
||||||
|
}
|
||||||
|
|
||||||
torrent_file* addChild(QString fileName, bool dir, size_type size=0, int index = -1, float progress=0., int priority=1) {
|
int getPriority() const {
|
||||||
Q_ASSERT(is_dir);
|
return priority;
|
||||||
qDebug("Adding a new child of size: %ld", (long)size);
|
|
||||||
torrent_file *f = new torrent_file(this, QDir::cleanPath(rel_path+QDir::separator()+fileName), dir, size, index, progress, priority);
|
|
||||||
children << f;
|
|
||||||
if(size) {
|
|
||||||
addBytes(size);
|
|
||||||
}
|
}
|
||||||
return f;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool removeFromFS(QString saveDir) const {
|
size_type getSize() const {
|
||||||
QString full_path = saveDir + QDir::separator() + rel_path;
|
return size;
|
||||||
if(!QFile::exists(full_path)) {
|
|
||||||
qDebug("%s does not exist, no need to remove it", full_path.toLocal8Bit().data());
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
bool success = true;
|
|
||||||
qDebug("We have %d children", children.size());
|
float getProgress() const {
|
||||||
foreach(const torrent_file *f, children) {
|
return progress;
|
||||||
bool s = f->removeFromFS(saveDir);
|
|
||||||
success = s && success;
|
|
||||||
}
|
}
|
||||||
if(is_dir) {
|
|
||||||
qDebug("trying to remove directory: %s", full_path.toLocal8Bit().data());
|
int getIndex() const {
|
||||||
QDir dir(full_path);
|
return index;
|
||||||
dir.rmdir(full_path);
|
}
|
||||||
} else {
|
|
||||||
qDebug("trying to remove file: %s", full_path.toLocal8Bit().data());
|
bool isDir() const {
|
||||||
bool s = QFile::remove(full_path);
|
return is_dir;
|
||||||
success = s && success;
|
}
|
||||||
|
|
||||||
|
bool hasChildren() const {
|
||||||
|
return (!children.isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<const torrent_file*> getChildren() const {
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
|
||||||
|
const torrent_file* getChild(QString fileName) const {
|
||||||
|
Q_ASSERT(is_dir);
|
||||||
|
foreach(const torrent_file *f, children) {
|
||||||
|
if(f->name() == fileName) return f;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void addBytes(size_type b) {
|
||||||
|
size += b;
|
||||||
|
if(parent)
|
||||||
|
parent->addBytes(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
torrent_file* addChild(QString fileName, bool dir, size_type size=0, int index = -1, float progress=0., int priority=1) {
|
||||||
|
Q_ASSERT(is_dir);
|
||||||
|
qDebug("Adding a new child of size: %ld", (long)size);
|
||||||
|
torrent_file *f = new torrent_file(this, QDir::cleanPath(rel_path+QDir::separator()+fileName), dir, size, index, progress, priority);
|
||||||
|
children << f;
|
||||||
|
if(size) {
|
||||||
|
addBytes(size);
|
||||||
|
}
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool removeFromFS(QString saveDir) const {
|
||||||
|
QString full_path = saveDir + QDir::separator() + rel_path;
|
||||||
|
if(!QFile::exists(full_path)) {
|
||||||
|
qDebug("%s does not exist, no need to remove it", full_path.toUtf8().data());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool success = true;
|
||||||
|
qDebug("We have %d children", children.size());
|
||||||
|
foreach(const torrent_file *f, children) {
|
||||||
|
bool s = f->removeFromFS(saveDir);
|
||||||
|
success = s && success;
|
||||||
|
}
|
||||||
|
if(is_dir) {
|
||||||
|
qDebug("trying to remove directory: %s", full_path.toUtf8().data());
|
||||||
|
QDir dir(full_path);
|
||||||
|
dir.rmdir(full_path);
|
||||||
|
} else {
|
||||||
|
qDebug("trying to remove file: %s", full_path.toUtf8().data());
|
||||||
|
bool s = QFile::remove(full_path);
|
||||||
|
success = s && success;
|
||||||
|
}
|
||||||
|
return success;
|
||||||
}
|
}
|
||||||
return success;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class arborescence {
|
class arborescence {
|
||||||
private:
|
private:
|
||||||
torrent_file *root;
|
torrent_file *root;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
arborescence(boost::intrusive_ptr<torrent_info> t) {
|
arborescence(boost::intrusive_ptr<torrent_info> t) {
|
||||||
torrent_info::file_iterator fi = t->begin_files();
|
torrent_info::file_iterator fi = t->begin_files();
|
||||||
if(t->num_files() > 1) {
|
if(t->num_files() > 1) {
|
||||||
root = new torrent_file(0, misc::toQString(t->name()), true);
|
root = new torrent_file(0, misc::toQString(t->name()), true);
|
||||||
} else {
|
} else {
|
||||||
// XXX: Will crash if there is no file in torrent
|
// XXX: Will crash if there is no file in torrent
|
||||||
root = new torrent_file(0, misc::toQString(t->name()), false, fi->size, 0);
|
root = new torrent_file(0, misc::toQString(t->name()), false, fi->size, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while(fi != t->end_files()) {
|
while(fi != t->end_files()) {
|
||||||
QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
|
QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
|
||||||
addFile(path, fi->size, i);
|
addFile(path, fi->size, i);
|
||||||
fi++;
|
fi++;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
qDebug("real size: %ld, tree size: %ld", (long)t->total_size(), (long)root->getSize());
|
qDebug("real size: %ld, tree size: %ld", (long)t->total_size(), (long)root->getSize());
|
||||||
Q_ASSERT(root->getSize() == t->total_size());
|
Q_ASSERT(root->getSize() == t->total_size());
|
||||||
}
|
}
|
||||||
|
|
||||||
arborescence(torrent_info const& t, std::vector<size_type> fp, std::vector<int> files_priority) {
|
arborescence(torrent_info const& t, std::vector<size_type> fp, int *prioritiesTab) {
|
||||||
torrent_info::file_iterator fi = t.begin_files();
|
torrent_info::file_iterator fi = t.begin_files();
|
||||||
if(t.num_files() > 1) {
|
if(t.num_files() > 1) {
|
||||||
qDebug("More than one file in the torrent, setting a folder as root");
|
qDebug("More than one file in the torrent, setting a folder as root");
|
||||||
root = new torrent_file(0, misc::toQString(t.name()), true);
|
root = new torrent_file(0, misc::toQString(t.name()), true);
|
||||||
} else {
|
} else {
|
||||||
// XXX: Will crash if there is no file in torrent
|
// XXX: Will crash if there is no file in torrent
|
||||||
qDebug("one file in the torrent, setting it as root with index 0");
|
qDebug("one file in the torrent, setting it as root with index 0");
|
||||||
root = new torrent_file(0, misc::toQString(t.name()), false, fi->size, 0, ((double)fp[0])/t.file_at(0).size, files_priority.at(0));
|
root = new torrent_file(0, misc::toQString(t.name()), false, fi->size, 0, ((float)fp[0])/t.file_at(0).size, prioritiesTab[0]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while(fi != t.end_files()) {
|
while(fi != t.end_files()) {
|
||||||
QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
|
QString path = QDir::cleanPath(misc::toQString(fi->path.string()));
|
||||||
addFile(path, fi->size, i, ((double)fp[i])/t.file_at(i).size, files_priority.at(i));
|
addFile(path, fi->size, i, ((float)fp[i])/t.file_at(i).size, prioritiesTab[i]);
|
||||||
fi++;
|
fi++;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
qDebug("real size: %ld, tree size: %ld", (long)t.total_size(), (long)root->getSize());
|
qDebug("real size: %ld, tree size: %ld", (long)t.total_size(), (long)root->getSize());
|
||||||
Q_ASSERT(root->getSize() == t.total_size());
|
Q_ASSERT(root->getSize() == t.total_size());
|
||||||
}
|
}
|
||||||
|
|
||||||
~arborescence() {
|
~arborescence() {
|
||||||
delete root;
|
delete root;
|
||||||
}
|
}
|
||||||
|
|
||||||
torrent_file* getRoot() const {
|
torrent_file* getRoot() const {
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool removeFromFS(QString saveDir) {
|
bool removeFromFS(QString saveDir) {
|
||||||
if(!QFile::exists(saveDir+QDir::separator()+root->path())) return true;
|
if(!QFile::exists(saveDir+QDir::separator()+root->path())) return true;
|
||||||
bool success = root->removeFromFS(saveDir);
|
bool success = root->removeFromFS(saveDir);
|
||||||
QDir root_dir(root->path());
|
QDir root_dir(root->path());
|
||||||
root_dir.rmdir(saveDir+QDir::separator()+root->path());
|
root_dir.rmdir(saveDir+QDir::separator()+root->path());
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void addFile(QString path, size_type file_size, int index, float progress=0., int priority=1) {
|
void addFile(QString path, size_type file_size, int index, float progress=0., int priority=1) {
|
||||||
Q_ASSERT(root->isDir());
|
Q_ASSERT(root->isDir());
|
||||||
path = QDir::cleanPath(path);
|
path = QDir::cleanPath(path);
|
||||||
//Q_ASSERT(path.startsWith(root->path()));
|
//Q_ASSERT(path.startsWith(root->path()));
|
||||||
QString relative_path = path.remove(0, root->path().size());
|
QString relative_path = path.remove(0, root->path().size());
|
||||||
if(relative_path.at(0) ==QDir::separator())
|
if(relative_path.at(0) ==QDir::separator())
|
||||||
relative_path.remove(0, 1);
|
relative_path.remove(0, 1);
|
||||||
QStringList fileNames = relative_path.split(QDir::separator());
|
QStringList fileNames = relative_path.split(QDir::separator());
|
||||||
torrent_file *dad = root;
|
torrent_file *dad = root;
|
||||||
unsigned int nb_i = 0;
|
unsigned int nb_i = 0;
|
||||||
unsigned int size = fileNames.size();
|
unsigned int size = fileNames.size();
|
||||||
foreach(const QString &fileName, fileNames) {
|
foreach(const QString &fileName, fileNames) {
|
||||||
++nb_i;
|
++nb_i;
|
||||||
if(fileName == ".") continue;
|
if(fileName == ".") continue;
|
||||||
const torrent_file* child = dad->getChild(fileName);
|
const torrent_file* child = dad->getChild(fileName);
|
||||||
if(!child) {
|
if(!child) {
|
||||||
if(nb_i != size) {
|
if(nb_i != size) {
|
||||||
// Folder
|
// Folder
|
||||||
child = dad->addChild(fileName, true);
|
child = dad->addChild(fileName, true);
|
||||||
} else {
|
} else {
|
||||||
// File
|
// File
|
||||||
child = dad->addChild(fileName, false, file_size, index, progress, priority);
|
child = dad->addChild(fileName, false, file_size, index, progress, priority);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
dad = (torrent_file*)child;
|
||||||
}
|
}
|
||||||
dad = (torrent_file*)child;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
1204
src/bittorrent.cpp
@@ -60,7 +60,6 @@ class bittorrent : public QObject {
|
|||||||
bool DHTEnabled;
|
bool DHTEnabled;
|
||||||
QPointer<downloadThread> downloader;
|
QPointer<downloadThread> downloader;
|
||||||
QString defaultSavePath;
|
QString defaultSavePath;
|
||||||
QString defaultTempPath;
|
|
||||||
QHash<QString, QHash<QString, QString> > trackersErrors;
|
QHash<QString, QHash<QString, QString> > trackersErrors;
|
||||||
QStringList consoleMessages;
|
QStringList consoleMessages;
|
||||||
QStringList peerBanMessages;
|
QStringList peerBanMessages;
|
||||||
@@ -76,7 +75,6 @@ class bittorrent : public QObject {
|
|||||||
QString filterPath;
|
QString filterPath;
|
||||||
bool queueingEnabled;
|
bool queueingEnabled;
|
||||||
QStringList url_skippingDlg;
|
QStringList url_skippingDlg;
|
||||||
QHash<QString, QString> savepath_fromurl;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
QString getSavePath(QString hash);
|
QString getSavePath(QString hash);
|
||||||
@@ -108,25 +106,19 @@ class bittorrent : public QObject {
|
|||||||
QStringList getConsoleMessages() const;
|
QStringList getConsoleMessages() const;
|
||||||
QStringList getPeerBanMessages() const;
|
QStringList getPeerBanMessages() const;
|
||||||
qlonglong getETA(QString hash) const;
|
qlonglong getETA(QString hash) const;
|
||||||
bool useTemporaryFolder() const;
|
|
||||||
QString getDefaultSavePath() const;
|
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
QTorrentHandle addTorrent(QString path, bool fromScanDir = false, QString from_url = QString(), bool resumed = false);
|
QTorrentHandle addTorrent(QString path, bool fromScanDir = false, QString from_url = QString(), bool resumed = false);
|
||||||
QTorrentHandle addMagnetUri(QString magnet_uri, bool resumed=false);
|
|
||||||
void importOldTorrents();
|
|
||||||
void applyFormerAttributeFiles(QTorrentHandle h);
|
|
||||||
void importOldTempData(QString torrent_path);
|
|
||||||
void loadSessionState();
|
void loadSessionState();
|
||||||
void saveSessionState();
|
void saveSessionState();
|
||||||
void downloadFromUrl(QString url);
|
void downloadFromUrl(QString url);
|
||||||
|
void downloadFromURLList(const QStringList& url_list);
|
||||||
void deleteTorrent(QString hash, bool permanent = false);
|
void deleteTorrent(QString hash, bool permanent = false);
|
||||||
void startUpTorrents();
|
|
||||||
/* Needed by Web UI */
|
/* Needed by Web UI */
|
||||||
void pauseAllTorrents();
|
void pauseAllTorrents();
|
||||||
|
void resumeAllTorrents();
|
||||||
void pauseTorrent(QString hash);
|
void pauseTorrent(QString hash);
|
||||||
void resumeTorrent(QString hash);
|
void resumeTorrent(QString hash);
|
||||||
void resumeAllTorrents();
|
|
||||||
/* End Web UI */
|
/* End Web UI */
|
||||||
void saveDHTEntry();
|
void saveDHTEntry();
|
||||||
void preAllocateAllFiles(bool b);
|
void preAllocateAllFiles(bool b);
|
||||||
@@ -136,14 +128,17 @@ class bittorrent : public QObject {
|
|||||||
void enableIPFilter(QString filter);
|
void enableIPFilter(QString filter);
|
||||||
void disableIPFilter();
|
void disableIPFilter();
|
||||||
void setQueueingEnabled(bool enable);
|
void setQueueingEnabled(bool enable);
|
||||||
|
void resumeUnfinishedTorrents();
|
||||||
|
void saveTorrentPriority(QString hash, int prio);
|
||||||
|
void saveTorrentSpeedLimits(QString hash);
|
||||||
void loadTorrentSpeedLimits(QString hash);
|
void loadTorrentSpeedLimits(QString hash);
|
||||||
void handleDownloadFailure(QString url, QString reason);
|
void handleDownloadFailure(QString url, QString reason);
|
||||||
void loadWebSeeds(QString fileHash);
|
void loadWebSeeds(QString fileHash);
|
||||||
void increaseDlTorrentPriority(QString hash);
|
void increaseDlTorrentPriority(QString hash);
|
||||||
void decreaseDlTorrentPriority(QString hash);
|
void decreaseDlTorrentPriority(QString hash);
|
||||||
void downloadUrlAndSkipDialog(QString url, QString save_path=QString::null);
|
void downloadUrlAndSkipDialog(QString);
|
||||||
// Session configuration - Setters
|
// Session configuration - Setters
|
||||||
void setListeningPort(int port);
|
void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
|
||||||
void setMaxConnections(int maxConnec);
|
void setMaxConnections(int maxConnec);
|
||||||
void setMaxConnectionsPerTorrent(int max);
|
void setMaxConnectionsPerTorrent(int max);
|
||||||
void setMaxUploadsPerTorrent(int max);
|
void setMaxUploadsPerTorrent(int max);
|
||||||
@@ -156,7 +151,6 @@ class bittorrent : public QObject {
|
|||||||
void setSessionSettings(session_settings sessionSettings);
|
void setSessionSettings(session_settings sessionSettings);
|
||||||
void startTorrentsInPause(bool b);
|
void startTorrentsInPause(bool b);
|
||||||
void setDefaultSavePath(QString savepath);
|
void setDefaultSavePath(QString savepath);
|
||||||
void setDefaultTempPath(QString temppath);
|
|
||||||
void applyEncryptionSettings(pe_settings se);
|
void applyEncryptionSettings(pe_settings se);
|
||||||
void loadFilesPriorities(QTorrentHandle& h);
|
void loadFilesPriorities(QTorrentHandle& h);
|
||||||
void setDownloadLimit(QString hash, long val);
|
void setDownloadLimit(QString hash, long val);
|
||||||
@@ -168,13 +162,12 @@ class bittorrent : public QObject {
|
|||||||
void addConsoleMessage(QString msg, QColor color=QApplication::palette().color(QPalette::WindowText));
|
void addConsoleMessage(QString msg, QColor color=QApplication::palette().color(QPalette::WindowText));
|
||||||
void addPeerBanMessage(QString msg, bool from_ipfilter);
|
void addPeerBanMessage(QString msg, bool from_ipfilter);
|
||||||
void processDownloadedFile(QString, QString);
|
void processDownloadedFile(QString, QString);
|
||||||
void saveTrackerFile(QString hash);
|
|
||||||
void addMagnetSkipAddDlg(QString uri);
|
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void scanDirectory(QString);
|
void scanDirectory(QString);
|
||||||
void readAlerts();
|
void readAlerts();
|
||||||
void loadTrackerFile(QString hash);
|
bool loadTrackerFile(QString hash);
|
||||||
|
void saveTrackerFile(QString hash);
|
||||||
void deleteBigRatios();
|
void deleteBigRatios();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
@@ -183,15 +176,13 @@ class bittorrent : public QObject {
|
|||||||
void pausedTorrent(QTorrentHandle& h);
|
void pausedTorrent(QTorrentHandle& h);
|
||||||
void resumedTorrent(QTorrentHandle& h);
|
void resumedTorrent(QTorrentHandle& h);
|
||||||
void finishedTorrent(QTorrentHandle& h);
|
void finishedTorrent(QTorrentHandle& h);
|
||||||
void fullDiskError(QTorrentHandle& h, QString msg);
|
void fullDiskError(QTorrentHandle& h);
|
||||||
void trackerError(QString hash, QString time, QString msg);
|
void trackerError(QString hash, QString time, QString msg);
|
||||||
void trackerAuthenticationRequired(QTorrentHandle& h);
|
void trackerAuthenticationRequired(QTorrentHandle& h);
|
||||||
void newDownloadedTorrent(QString path, QString url);
|
void newDownloadedTorrent(QString path, QString url);
|
||||||
void updateFileSize(QString hash);
|
void updateFileSize(QString hash);
|
||||||
void downloadFromUrlFailure(QString url, QString reason);
|
void downloadFromUrlFailure(QString url, QString reason);
|
||||||
void torrentFinishedChecking(QTorrentHandle& h);
|
void torrentFinishedChecking(QTorrentHandle& h);
|
||||||
void metadataReceived(QTorrentHandle &h);
|
|
||||||
void torrentPaused(QTorrentHandle &h);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<string>qBittorrent console</string>
|
<string>qBittorrent console</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowIcon" >
|
<property name="windowIcon" >
|
||||||
<iconset resource="icons.qrc" >:/Icons/oxygen/log.png</iconset>
|
<iconset resource="icons.qrc" >:/Icons/log.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
<string>General</string>
|
<string>General</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
<attribute name="icon" >
|
<attribute name="icon" >
|
||||||
<iconset resource="icons.qrc" >:/Icons/oxygen/log.png</iconset>
|
<iconset resource="icons.qrc" >:/Icons/log.png</iconset>
|
||||||
</attribute>
|
</attribute>
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
|
|||||||
@@ -1,34 +1,33 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<ui version="4.0" >
|
||||||
<ui version="4.0">
|
|
||||||
<class>createTorrentDialog</class>
|
<class>createTorrentDialog</class>
|
||||||
<widget class="QDialog" name="createTorrentDialog">
|
<widget class="QDialog" name="createTorrentDialog" >
|
||||||
<property name="geometry">
|
<property name="geometry" >
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>592</width>
|
<width>592</width>
|
||||||
<height>658</height>
|
<height>655</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle" >
|
||||||
<string>Torrent Creation Tool</string>
|
<string>Torrent Creation Tool</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="createTorrent_title">
|
<widget class="QLabel" name="createTorrent_title" >
|
||||||
<property name="minimumSize">
|
<property name="minimumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
<height>27</height>
|
<height>27</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>16777215</width>
|
<width>16777215</width>
|
||||||
<height>27</height>
|
<height>27</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="font">
|
<property name="font" >
|
||||||
<font>
|
<font>
|
||||||
<family>Sans Serif</family>
|
<family>Sans Serif</family>
|
||||||
<pointsize>14</pointsize>
|
<pointsize>14</pointsize>
|
||||||
@@ -39,107 +38,105 @@
|
|||||||
<strikeout>false</strikeout>
|
<strikeout>false</strikeout>
|
||||||
</font>
|
</font>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Torrent file creation</string>
|
<string>Torrent file creation</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="alignment">
|
<property name="alignment" >
|
||||||
<set>Qt::AlignCenter</set>
|
<set>Qt::AlignCenter</set>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="lbl_input">
|
<widget class="QLabel" name="lbl_input" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>File or folder to add to the torrent:</string>
|
<string>File or folder to add to the torrent:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLineEdit" name="textInputPath"/>
|
<widget class="QLineEdit" name="textInputPath" />
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="addFile_button">
|
<widget class="QPushButton" name="addFile_button" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Add file</string>
|
<string>Add a file</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon" >
|
||||||
<iconset resource="icons.qrc">
|
<iconset resource="icons.qrc" >:/Icons/add_file.png</iconset>
|
||||||
<normaloff>:/Icons/oxygen/document-new.png</normaloff>:/Icons/oxygen/document-new.png</iconset>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="addFolder_button">
|
<widget class="QPushButton" name="addFolder_button" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Add folder</string>
|
<string>Add a folder</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon" >
|
||||||
<iconset resource="icons.qrc">
|
<iconset resource="icons.qrc" >:/Icons/add_folder.png</iconset>
|
||||||
<normaloff>:/Icons/oxygen/folder-new.png</normaloff>:/Icons/oxygen/folder-new.png</iconset>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="lbl_announce_url">
|
<widget class="QLabel" name="lbl_announce_url" >
|
||||||
<property name="minimumSize">
|
<property name="minimumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
<height>102</height>
|
<height>102</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>16777215</width>
|
<width>16777215</width>
|
||||||
<height>70</height>
|
<height>70</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Announce urls (trackers):</string>
|
<string>Announce urls (trackers):</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="buddy">
|
<property name="buddy" >
|
||||||
<cstring></cstring>
|
<cstring></cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="urlSeeds_lbl">
|
<widget class="QLabel" name="urlSeeds_lbl" >
|
||||||
<property name="minimumSize">
|
<property name="minimumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
<height>101</height>
|
<height>101</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Web seeds urls (optional):</string>
|
<string>Web seeds urls (optional):</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="lbl_comment">
|
<widget class="QLabel" name="lbl_comment" >
|
||||||
<property name="minimumSize">
|
<property name="minimumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>0</width>
|
<width>0</width>
|
||||||
<height>102</height>
|
<height>102</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>16777215</width>
|
<width>16777215</width>
|
||||||
<height>102</height>
|
<height>102</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Comment (optional):</string>
|
<string>Comment (optional):</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="buddy">
|
<property name="buddy" >
|
||||||
<cstring>txt_comment</cstring>
|
<cstring>txt_comment</cstring>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -147,36 +144,54 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="leftMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin" >
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QListWidget" name="trackers_list">
|
<widget class="QListWidget" name="trackers_list" >
|
||||||
<property name="selectionMode">
|
<property name="selectionMode" >
|
||||||
<enum>QAbstractItemView::MultiSelection</enum>
|
<enum>QAbstractItemView::MultiSelection</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="leftMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin" >
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>16</height>
|
<height>16</height>
|
||||||
@@ -185,69 +200,55 @@
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="addTracker_button">
|
<widget class="QPushButton" name="addTracker_button" >
|
||||||
<property name="minimumSize">
|
<property name="minimumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>22</width>
|
<width>22</width>
|
||||||
<height>22</height>
|
<height>22</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>22</width>
|
<width>22</width>
|
||||||
<height>22</height>
|
<height>22</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon" >
|
||||||
<iconset resource="icons.qrc">
|
<iconset resource="icons.qrc" >:/Icons/skin/add.png</iconset>
|
||||||
<normaloff>:/Icons/oxygen/list-add.png</normaloff>:/Icons/oxygen/list-add.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="iconSize">
|
|
||||||
<size>
|
|
||||||
<width>18</width>
|
|
||||||
<height>18</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="removeTracker_button">
|
<widget class="QPushButton" name="removeTracker_button" >
|
||||||
<property name="minimumSize">
|
<property name="minimumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>22</width>
|
<width>22</width>
|
||||||
<height>22</height>
|
<height>22</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>22</width>
|
<width>22</width>
|
||||||
<height>22</height>
|
<height>22</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon" >
|
||||||
<iconset resource="icons.qrc">
|
<iconset resource="icons.qrc" >:/Icons/skin/remove.png</iconset>
|
||||||
<normaloff>:/Icons/oxygen/list-remove.png</normaloff>:/Icons/oxygen/list-remove.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="iconSize">
|
|
||||||
<size>
|
|
||||||
<width>18</width>
|
|
||||||
<height>18</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>16</height>
|
<height>16</height>
|
||||||
@@ -260,34 +261,52 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="leftMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin" >
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QListWidget" name="URLSeeds_list">
|
<widget class="QListWidget" name="URLSeeds_list" >
|
||||||
<property name="selectionMode">
|
<property name="selectionMode" >
|
||||||
<enum>QAbstractItemView::MultiSelection</enum>
|
<enum>QAbstractItemView::MultiSelection</enum>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QVBoxLayout">
|
<layout class="QVBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="leftMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin" >
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>16</height>
|
<height>16</height>
|
||||||
@@ -296,69 +315,55 @@
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="addURLSeed_button">
|
<widget class="QPushButton" name="addURLSeed_button" >
|
||||||
<property name="minimumSize">
|
<property name="minimumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>22</width>
|
<width>22</width>
|
||||||
<height>22</height>
|
<height>22</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>22</width>
|
<width>22</width>
|
||||||
<height>22</height>
|
<height>22</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon" >
|
||||||
<iconset resource="icons.qrc">
|
<iconset resource="icons.qrc" >:/Icons/skin/add.png</iconset>
|
||||||
<normaloff>:/Icons/oxygen/list-add.png</normaloff>:/Icons/oxygen/list-add.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="iconSize">
|
|
||||||
<size>
|
|
||||||
<width>18</width>
|
|
||||||
<height>18</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="removeURLSeed_button">
|
<widget class="QPushButton" name="removeURLSeed_button" >
|
||||||
<property name="minimumSize">
|
<property name="minimumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>22</width>
|
<width>22</width>
|
||||||
<height>22</height>
|
<height>22</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>22</width>
|
<width>22</width>
|
||||||
<height>22</height>
|
<height>22</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon" >
|
||||||
<iconset resource="icons.qrc">
|
<iconset resource="icons.qrc" >:/Icons/skin/remove.png</iconset>
|
||||||
<normaloff>:/Icons/oxygen/list-remove.png</normaloff>:/Icons/oxygen/list-remove.png</iconset>
|
|
||||||
</property>
|
|
||||||
<property name="iconSize">
|
|
||||||
<size>
|
|
||||||
<width>18</width>
|
|
||||||
<height>18</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>20</width>
|
<width>20</width>
|
||||||
<height>16</height>
|
<height>16</height>
|
||||||
@@ -371,14 +376,14 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTextEdit" name="txt_comment">
|
<widget class="QTextEdit" name="txt_comment" >
|
||||||
<property name="maximumSize">
|
<property name="maximumSize" >
|
||||||
<size>
|
<size>
|
||||||
<width>421</width>
|
<width>421</width>
|
||||||
<height>102</height>
|
<height>102</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="acceptRichText">
|
<property name="acceptRichText" >
|
||||||
<bool>false</bool>
|
<bool>false</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -388,56 +393,56 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="txtPieceSize">
|
<widget class="QLabel" name="txtPieceSize" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Piece size:</string>
|
<string>Piece size:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="comboPieceSize">
|
<widget class="QComboBox" name="comboPieceSize" >
|
||||||
<property name="currentIndex">
|
<property name="currentIndex" >
|
||||||
<number>3</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>32 KiB</string>
|
<string>32 KiB</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>64 KiB</string>
|
<string>64 KiB</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>128 KiB</string>
|
<string>128 KiB</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>256 KiB</string>
|
<string>256 KiB</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>512 KiB</string>
|
<string>512 KiB</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>1 MiB</string>
|
<string>1 MiB</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>2 MiB</string>
|
<string>2 MiB</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>4 MiB</string>
|
<string>4 MiB</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
@@ -445,10 +450,10 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>40</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -459,47 +464,56 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="check_private">
|
<widget class="QCheckBox" name="check_private" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Private (won't be distributed on DHT network if enabled)</string>
|
<string>Private (won't be distributed on DHT network if enabled)</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QCheckBox" name="checkStartSeeding">
|
<widget class="QCheckBox" name="checkStartSeeding" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Start seeding after creation</string>
|
<string>Start seeding after creation</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="progressLbl">
|
<widget class="QLabel" name="progressLbl" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Progress:</string>
|
<string>Progress:</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QProgressBar" name="progressBar">
|
<widget class="QProgressBar" name="progressBar" >
|
||||||
<property name="value">
|
<property name="value" >
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout">
|
<layout class="QHBoxLayout" >
|
||||||
<property name="spacing">
|
<property name="spacing" >
|
||||||
<number>6</number>
|
<number>6</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="margin">
|
<property name="leftMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin" >
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin" >
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>131</width>
|
<width>131</width>
|
||||||
<height>31</height>
|
<height>31</height>
|
||||||
@@ -508,25 +522,25 @@
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="createButton">
|
<widget class="QPushButton" name="createButton" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Create and save...</string>
|
<string>Create and save...</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QPushButton" name="cancelButton">
|
<widget class="QPushButton" name="cancelButton" >
|
||||||
<property name="text">
|
<property name="text" >
|
||||||
<string>Cancel</string>
|
<string>Cancel</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer>
|
<spacer>
|
||||||
<property name="orientation">
|
<property name="orientation" >
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizeHint" stdset="0">
|
<property name="sizeHint" >
|
||||||
<size>
|
<size>
|
||||||
<width>40</width>
|
<width>40</width>
|
||||||
<height>20</height>
|
<height>20</height>
|
||||||
@@ -539,7 +553,7 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="icons.qrc"/>
|
<include location="icons.qrc" />
|
||||||
</resources>
|
</resources>
|
||||||
<connections>
|
<connections>
|
||||||
<connection>
|
<connection>
|
||||||
@@ -548,11 +562,11 @@
|
|||||||
<receiver>createTorrentDialog</receiver>
|
<receiver>createTorrentDialog</receiver>
|
||||||
<slot>reject()</slot>
|
<slot>reject()</slot>
|
||||||
<hints>
|
<hints>
|
||||||
<hint type="sourcelabel">
|
<hint type="sourcelabel" >
|
||||||
<x>355</x>
|
<x>355</x>
|
||||||
<y>275</y>
|
<y>275</y>
|
||||||
</hint>
|
</hint>
|
||||||
<hint type="destinationlabel">
|
<hint type="destinationlabel" >
|
||||||
<x>179</x>
|
<x>179</x>
|
||||||
<y>282</y>
|
<y>282</y>
|
||||||
</hint>
|
</hint>
|
||||||
|
|||||||
@@ -166,10 +166,10 @@ void createtorrent::on_createButton_clicked(){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QStringList trackers = allItems(trackers_list);
|
QStringList trackers = allItems(trackers_list);
|
||||||
/*if(!trackers.size()){
|
if(!trackers.size()){
|
||||||
QMessageBox::critical(0, tr("No tracker path set"), tr("Please set at least one tracker"));
|
QMessageBox::critical(0, tr("No tracker path set"), tr("Please set at least one tracker"));
|
||||||
return;
|
return;
|
||||||
}*/
|
}
|
||||||
QString destination = QFileDialog::getSaveFileName(this, tr("Select destination torrent file"), QDir::homePath(), tr("Torrent Files")+QString::fromUtf8(" (*.torrent)"));
|
QString destination = QFileDialog::getSaveFileName(this, tr("Select destination torrent file"), QDir::homePath(), tr("Torrent Files")+QString::fromUtf8(" (*.torrent)"));
|
||||||
if(!destination.isEmpty()) {
|
if(!destination.isEmpty()) {
|
||||||
if(!destination.endsWith(QString::fromUtf8(".torrent")))
|
if(!destination.endsWith(QString::fromUtf8(".torrent")))
|
||||||
@@ -184,6 +184,7 @@ void createtorrent::on_createButton_clicked(){
|
|||||||
|
|
||||||
void createtorrent::handleCreationFailure(QString msg) {
|
void createtorrent::handleCreationFailure(QString msg) {
|
||||||
QMessageBox::information(0, tr("Torrent creation"), tr("Torrent creation was unsuccessful, reason: %1").arg(msg));
|
QMessageBox::information(0, tr("Torrent creation"), tr("Torrent creation was unsuccessful, reason: %1").arg(msg));
|
||||||
|
hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
void createtorrent::handleCreationSuccess(QString path, const char* branch_path) {
|
void createtorrent::handleCreationSuccess(QString path, const char* branch_path) {
|
||||||
@@ -191,7 +192,7 @@ void createtorrent::handleCreationSuccess(QString path, const char* branch_path)
|
|||||||
// Create save path file
|
// Create save path file
|
||||||
boost::intrusive_ptr<torrent_info> t;
|
boost::intrusive_ptr<torrent_info> t;
|
||||||
try {
|
try {
|
||||||
t = new torrent_info(path.toLocal8Bit().data());
|
t = new torrent_info(path.toUtf8().data());
|
||||||
} catch(std::exception&) {
|
} catch(std::exception&) {
|
||||||
QMessageBox::critical(0, tr("Torrent creation"), tr("Created torrent file is invalid. It won't be added to download list."));
|
QMessageBox::critical(0, tr("Torrent creation"), tr("Created torrent file is invalid. It won't be added to download list."));
|
||||||
return;
|
return;
|
||||||
@@ -204,7 +205,7 @@ void createtorrent::handleCreationSuccess(QString path, const char* branch_path)
|
|||||||
emit torrent_to_seed(path);
|
emit torrent_to_seed(path);
|
||||||
}
|
}
|
||||||
QMessageBox::information(0, tr("Torrent creation"), tr("Torrent was created successfully:")+" "+path);
|
QMessageBox::information(0, tr("Torrent creation"), tr("Torrent was created successfully:")+" "+path);
|
||||||
close();
|
hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
void createtorrent::updateProgressBar(int progress) {
|
void createtorrent::updateProgressBar(int progress) {
|
||||||
@@ -227,12 +228,8 @@ void torrentCreatorThread::create(QString _input_path, QString _save_path, QStri
|
|||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendProgressUpdateSignal(int i, int num, torrentCreatorThread *parent){
|
void sendProgressUpdateSignal(int i, int num, QDialog *parent){
|
||||||
parent->sendProgressSignal((int)(i*100./(float)num));
|
((createtorrent*)parent)->updateProgressBar((int)(i*100./(float)num));
|
||||||
}
|
|
||||||
|
|
||||||
void torrentCreatorThread::sendProgressSignal(int progress) {
|
|
||||||
emit updateProgress(progress);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void torrentCreatorThread::run() {
|
void torrentCreatorThread::run() {
|
||||||
@@ -241,7 +238,7 @@ void torrentCreatorThread::run() {
|
|||||||
try {
|
try {
|
||||||
file_storage fs;
|
file_storage fs;
|
||||||
file_pool fp;
|
file_pool fp;
|
||||||
path full_path = complete(path(input_path.toLocal8Bit().data()));
|
path full_path = complete(path(input_path.toUtf8().data()));
|
||||||
// Adding files to the torrent
|
// Adding files to the torrent
|
||||||
add_files(fs, full_path, file_filter);
|
add_files(fs, full_path, file_filter);
|
||||||
if(abort) return;
|
if(abort) return;
|
||||||
@@ -250,23 +247,25 @@ void torrentCreatorThread::run() {
|
|||||||
// Add url seeds
|
// Add url seeds
|
||||||
QString seed;
|
QString seed;
|
||||||
foreach(seed, url_seeds){
|
foreach(seed, url_seeds){
|
||||||
t.add_url_seed(seed.toLocal8Bit().data());
|
t.add_url_seed(seed.toUtf8().data());
|
||||||
}
|
}
|
||||||
for(int i=0; i<trackers.size(); ++i){
|
for(int i=0; i<trackers.size(); ++i){
|
||||||
t.add_tracker(trackers.at(i).toLocal8Bit().data());
|
t.add_tracker(trackers.at(i).toUtf8().data());
|
||||||
}
|
}
|
||||||
if(abort) return;
|
if(abort) return;
|
||||||
// calculate the hash for all pieces
|
// calculate the hash for all pieces
|
||||||
set_piece_hashes(t, full_path.branch_path(), boost::bind<void>(&sendProgressUpdateSignal, _1, t.num_pieces(), this));
|
set_piece_hashes(t, full_path.branch_path(), boost::bind<void>(&sendProgressUpdateSignal, _1, t.num_pieces(), parent));
|
||||||
// Set qBittorrent as creator and add user comment to
|
// Set qBittorrent as creator and add user comment to
|
||||||
// torrent_info structure
|
// torrent_info structure
|
||||||
t.set_creator(creator_str);
|
t.set_creator(creator_str);
|
||||||
t.set_comment((const char*)comment.toLocal8Bit());
|
t.set_comment((const char*)comment.toUtf8());
|
||||||
// Is private ?
|
// Is private ?
|
||||||
t.set_priv(is_private);
|
if(is_private){
|
||||||
|
t.set_priv(true);
|
||||||
|
}
|
||||||
if(abort) return;
|
if(abort) return;
|
||||||
// create the torrent and print it to out
|
// create the torrent and print it to out
|
||||||
ofstream out(complete(path((const char*)save_path.toLocal8Bit())), std::ios_base::binary);
|
ofstream out(complete(path((const char*)save_path.toUtf8())), std::ios_base::binary);
|
||||||
bencode(std::ostream_iterator<char>(out), t.generate());
|
bencode(std::ostream_iterator<char>(out), t.generate());
|
||||||
emit updateProgress(100);
|
emit updateProgress(100);
|
||||||
emit creationSuccess(save_path, full_path.branch_path().string().c_str());
|
emit creationSuccess(save_path, full_path.branch_path().string().c_str());
|
||||||
|
|||||||