Compare commits

..

31 Commits

Author SHA1 Message Date
Christophe Dumez
e67fddab50 tagged v1.3.3 2009-04-06 20:25:21 +00:00
Christophe Dumez
d6ca454bad - Forgot to commit those headers 2009-04-05 18:49:27 +00:00
Christophe Dumez
e7581df394 - Fixed typo in novaprinter (Thanks Cristian Greco) 2009-04-05 17:13:03 +00:00
Christophe Dumez
65d763b30b - Cosmetic fix to license
- Updated Changelog
2009-04-05 17:03:17 +00:00
Christophe Dumez
16798879b9 - License fix due to problems with OpenSSL 2009-04-05 17:01:07 +00:00
Christophe Dumez
74ce8fc87e - Added ico favicon support to search engine plugins manager (until now, only png was supported)
- Updated server url for search plugins update (new search engine plugins are not compatible with qBittorrent < v1.3.3)
2009-03-30 21:40:35 +00:00
Christophe Dumez
7dde3423f7 - Updated nova2.py version to force update 2009-03-30 20:32:14 +00:00
Christophe Dumez
4a960a289e - Fix search item download when a column was sorted 2009-03-30 13:43:20 +00:00
Christophe Dumez
aad78a92f6 - Updated Finnish translation 2009-03-30 07:37:13 +00:00
Christophe Dumez
edaad3f605 - fix compilation with Qt <= 4.3 2009-03-28 19:55:44 +00:00
Christophe Dumez
6ef317da16 - bump to v1.3.3 2009-03-27 22:44:06 +00:00
Christophe Dumez
4ba084e7d5 - Torrent downloading is now handled by search engine plugins to allow for more flexibility 2009-03-27 22:29:42 +00:00
Christophe Dumez
6732d2e3de - Removed useless variable 2009-03-27 19:57:11 +00:00
Christophe Dumez
8e5f0404a8 - Force UTF-8 printing to term in search engine for avoid encoding problems 2009-03-27 14:35:35 +00:00
Christophe Dumez
080965f0e5 BUGFIX: Fixed search engine bug that prevented a torrent from appearing more than
once among all tabs
2009-03-27 13:30:21 +00:00
Christophe Dumez
cd9b6ec54e - fix for last commit 2009-03-26 21:00:47 +00:00
Christophe Dumez
e01a87e644 - Removed some debug output 2009-03-26 20:25:28 +00:00
Christophe Dumez
e0cba78dac - Should completely fix unicode problems in search engine 2009-03-26 20:17:14 +00:00
Christophe Dumez
22ff0374d5 - Fixed unicode support in btjunkie and mininova search engines 2009-03-26 16:53:17 +00:00
Christophe Dumez
813f52f452 - forgot to commit this file 2009-03-14 15:23:32 +00:00
Christophe Dumez
2dd376a5b1 BUGFIX: Fixed Web UI torrent upload form 2009-03-12 13:26:12 +00:00
Christophe Dumez
16832d52c0 - Updated changelog 2009-03-06 23:47:20 +00:00
Christophe Dumez
d128b734b0 - Updated splash screen 2009-03-06 23:37:04 +00:00
Christophe Dumez
9a300db87a - BUGFIX: RSS items read status is now remembered upon restart 2009-03-06 23:22:16 +00:00
Christophe Dumez
c6698cbf5a - Added patches for v1.3.2 2009-03-06 22:25:42 +00:00
Christophe Dumez
4c8ecf5459 - Tagged v1.3.x 2009-03-06 22:22:19 +00:00
Christophe Dumez
1a2fdc259c - BUGFIX: Fixed "hide top toolBar" feature 2009-02-04 19:16:56 +00:00
Christophe Dumez
5c3f2f0aed - Updated release date 2009-01-26 15:16:02 +00:00
Christophe Dumez
e0ef409220 - Updated release date 2009-01-26 15:15:19 +00:00
Christophe Dumez
d9199ce836 Moved v1.3.x to its own branch 2009-01-26 15:12:59 +00:00
Christophe Dumez
d78a47ad30 Tagged v1.3.1 release 2009-01-26 15:10:23 +00:00
192 changed files with 32342 additions and 34832 deletions

View File

@@ -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

View File

@@ -1,59 +1,3 @@
* Unknown - Christophe Dumez <chris@qbittorrent.org> - v1.5.0
- FEATURE: Added Magnet URI support
- 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: If a torrent contains a torrent file, process downloaded torrent file too
- BUGFIX: torrent resume code rewrited
- COSMETIC: Redesigned RSS tab to improve usability
* Sun Aug 21 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.4.1
- BUGFIX: Fix problems when changing save path (if using temporary download folder)
- BUGFIX: Display real save path instead of the temporary one in torrent properties
- BUGFIX: Catching invalid_handle exception to avoid rare crashes
- BUGFIX: Fixed popup menu position in RSS feeds list
- BUGFIX: Don't save RSS feed state if it could not be updated
* Thu Aug 13 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.4.0
- FEATURE: Display swarm information in lists
- FEATURE: Allow to define temporary download folder
- FEATURE: Display total amount of uploaded data in finished list
- FEATURE: Resizing a column in a search results tab affects all tabs
- FEATURE: Search results tab columns are now remembered upon startup
- FEATURE: Added right click menu in search engine to clear completion history
- FEATURE: Allow to set a different port for DHT (UDP) than the one used for Bittorrent
- FEATURE: Updated spoofing code to avoid trackers ban
- BUGFIX: Provide more helpful explanation when an I/O error occured
- BUGFIX: Stop enforcing UTF-8 and use system locale instead
- COSMETIC: Redesigned program preferences
- COSMETIC: Updated icons set
* Fri Jul 24 2009 - Christophe DUMEZ <chris@qbittorrent.org> - 1.3.5
- BUGFIX: Made IP filter parser more robust
- BUGFIX: Fixed torrent creation tool
- BUGFIX: Fixed possible overflow in progress calculation in arborescence.h
- BUGFIX: Save properties window size, position, columns width and restore them
- BUGFIX: Set a minimum default width for NAME column in properties
- BUGFIX: Remember visual indexes of columns in transfer lists
* Sun Jul 12 2009 - Christophe DUMEZ <chris@qbittorrent.org> - v1.3.4
- BUGFIX: Fixed IP filter file parsing on 64bits
- BUGFIX: Suppressed QLayout: Attempting to add QLayout "" to properties "properties" warning message when opening a properties dialog
- BUGFIX: Fixed a little bug in search engine plugins helper file
- BUGFIX: Fixed compilation problems with Qt 4.3
- BUGFIX: Percentages no longer disapear with default cleanlooks style
- BUGFIX: Cleanly fixed popup menus position in lists (no more workarounds)
- BUGFIX: Fixed memory leak in search engine
- BUGFIX: Torrents with an infinite ratio are no longer affected by ratio_limit set in program preferences
- BUGFIX: Display a ratio of 0.0 if total_upload and total_download are both 0
- BUGFIX: Remove last separator in top tool bar
- BUGFIX: Tuned lists properties to make sure display is correct
- COSMETIC: Display date as well as time in log window
* Sun Apr 5 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.3.3 * Sun Apr 5 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.3.3
- BUGFIX: Fixed Web UI torrent upload form - BUGFIX: Fixed Web UI torrent upload form
- BUGFIX: Fixed unicode support in search engine - BUGFIX: Fixed unicode support in search engine

19
TODO
View File

@@ -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
View File

@@ -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

View File

@@ -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;

View File

@@ -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;
} }
}; };

View File

@@ -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

View File

@@ -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>

View File

@@ -44,13 +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.
class FinishedListDelegate: public QItemDelegate { class FinishedListDelegate: public QItemDelegate {
Q_OBJECT Q_OBJECT
@@ -64,7 +60,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;
@@ -77,7 +72,7 @@ class FinishedListDelegate: public QItemDelegate {
case F_RATIO:{ case F_RATIO:{
QItemDelegate::drawBackground(painter, opt, index); QItemDelegate::drawBackground(painter, opt, index);
double ratio = index.data().toDouble(); double ratio = index.data().toDouble();
if(ratio > MAX_RATIO) if(ratio > 100.)
QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8("")); QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8(""));
else else
QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1))); QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1)));

View File

@@ -46,17 +46,13 @@ 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); finishedList->setModel(finishedListModel);
finishedList->setRootIsDecorated(false);
finishedList->setAllColumnsShowFocus(true);
loadHiddenColumns(); loadHiddenColumns();
// Hide hash column // Hide hash column
finishedList->hideColumn(F_HASH); finishedList->hideColumn(F_HASH);
@@ -64,8 +60,6 @@ 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);
@@ -81,8 +75,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()));
@@ -92,14 +84,11 @@ 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()));
} }
@@ -126,9 +115,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()) {
@@ -187,23 +174,6 @@ 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;
} }
@@ -238,7 +208,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) {
@@ -251,11 +221,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");
} }
@@ -271,18 +236,7 @@ void FinishedTorrents::on_actionSet_upload_limit_triggered(){
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){
@@ -291,25 +245,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;
} }
@@ -318,11 +269,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))));
@@ -346,7 +294,7 @@ 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"));
} }
@@ -402,13 +350,12 @@ void FinishedTorrents::forceRecheck(){
if(index.column() == F_NAME){ if(index.column() == F_NAME){
QString hash = finishedListModel->data(finishedListModel->index(index.row(), F_HASH)).toString(); 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();
} }
} }
} }
void FinishedTorrents::displayFinishedListMenu(const QPoint&){ void FinishedTorrents::displayFinishedListMenu(const QPoint& pos){
QMenu myFinishedListMenu(this); QMenu myFinishedListMenu(this);
// Enable/disable pause/start action given the DL state // Enable/disable pause/start action given the DL state
QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes();
@@ -449,11 +396,11 @@ 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
myFinishedListMenu.exec(QCursor::pos()); // XXX: why mapToGlobal() is not enough?
myFinishedListMenu.exec(mapToGlobal(pos)+QPoint(10,58));
} }
@@ -488,12 +435,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
@@ -516,16 +463,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() {
@@ -551,9 +490,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;
@@ -587,14 +526,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;
@@ -618,7 +551,6 @@ void FinishedTorrents::toggleFinishedListSortOrder(int index) {
case F_SIZE: case F_SIZE:
case F_UPSPEED: case F_UPSPEED:
case F_RATIO: case F_RATIO:
case F_UPLOAD:
sortFinishedListFloat(index, sortOrder); sortFinishedListFloat(index, sortOrder);
break; break;
default: default:
@@ -643,8 +575,6 @@ void FinishedTorrents::sortFinishedList(int index, Qt::SortOrder sortOrder){
switch(index) { switch(index) {
case F_SIZE: case F_SIZE:
case F_UPSPEED: case F_UPSPEED:
case F_UPLOAD:
case F_RATIO:
sortFinishedListFloat(index, sortOrder); sortFinishedListFloat(index, sortOrder);
break; break;
default: default:

View File

@@ -79,9 +79,7 @@ class FinishedTorrents : public QWidget, public Ui::seeding {
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();
@@ -93,7 +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 updateMetadata(QTorrentHandle &h);
signals: signals:
void torrentMovedFromFinishedList(QString); void torrentMovedFromFinishedList(QString);

File diff suppressed because it is too large Load Diff

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1005 B

BIN
src/Icons/add_folder.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
src/Icons/bt_settings.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/Icons/button_cancel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
src/Icons/button_ok.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
src/Icons/configure.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
src/Icons/connection.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 B

BIN
src/Icons/description.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

BIN
src/Icons/download.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 575 B

After

Width:  |  Height:  |  Size: 575 B

View File

Before

Width:  |  Height:  |  Size: 750 B

After

Width:  |  Height:  |  Size: 750 B

View File

Before

Width:  |  Height:  |  Size: 704 B

After

Width:  |  Height:  |  Size: 704 B

BIN
src/Icons/filter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 998 B

View File

Before

Width:  |  Height:  |  Size: 449 B

After

Width:  |  Height:  |  Size: 449 B

BIN
src/Icons/gear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
src/Icons/home.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/Icons/log.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 846 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

BIN
src/Icons/newmsg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 796 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 873 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 860 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 892 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 937 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 885 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 923 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 907 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 541 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 752 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 813 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/Icons/password.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
src/Icons/proxy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,6 +1,6 @@
[Desktop Entry] [Desktop Entry]
Categories=Qt;Network;P2P Categories=Qt;Network;P2P
Comment=V1.5.0 Comment=V1.3.3
Exec=qbittorrent %f Exec=qbittorrent %f
GenericName=Bittorrent client GenericName=Bittorrent client
GenericName[bg]=Торент клиент GenericName[bg]=Торент клиент

View File

Before

Width:  |  Height:  |  Size: 965 B

After

Width:  |  Height:  |  Size: 965 B

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
src/Icons/refresh.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 948 B

BIN
src/Icons/skin/add.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 842 B

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

BIN
src/Icons/star.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/Icons/style.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/Icons/subscribe.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/Icons/subscribe16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 739 B

BIN
src/Icons/systemtray.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 856 B

After

Width:  |  Height:  |  Size: 856 B

BIN
src/Icons/unavailable.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 888 B

View File

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 765 B

After

Width:  |  Height:  |  Size: 765 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 722 B

After

Width:  |  Height:  |  Size: 629 B

BIN
src/Icons/wizard.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -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,264 @@
<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>&amp;Edit</string> <string>&amp;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>&amp;Help</string> <string>&amp;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>&amp;File</string> <string>&amp;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" />
<addaction name="separator" />
</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>

View File

@@ -75,36 +75,19 @@ SearchTab::SearchTab(SearchEngine *parent) : QWidget()
connect(resultsBrowser->header(), SIGNAL(sectionPressed(int)), this, SLOT(sortSearchList(int))); connect(resultsBrowser->header(), SIGNAL(sectionPressed(int)), this, SLOT(sortSearchList(int)));
// Load last columns width for search results list // Load last columns width for search results list
if(!loadColWidthResultsList()){ if(!loadColWidthSearchList()){
resultsBrowser->header()->resizeSection(0, 275); resultsBrowser->header()->resizeSection(0, 275);
} }
} }
SearchTab::~SearchTab() { SearchTab::~SearchTab()
{
saveColWidthSearchList();
delete resultsBrowser; delete resultsBrowser;
delete SearchListModel; delete SearchListModel;
delete SearchDelegate; delete SearchDelegate;
} }
QHeaderView* SearchTab::header() const {
return resultsBrowser->header();
}
bool SearchTab::loadColWidthResultsList() {
QSettings settings("qBittorrent", "qBittorrent");
QString line = settings.value("SearchResultsColsWidth", QString()).toString();
if(line.isEmpty())
return false;
QStringList width_list = line.split(' ');
if(width_list.size() < SearchListModel->columnCount())
return false;
unsigned int listSize = width_list.size();
for(unsigned int i=0; i<listSize; ++i){
resultsBrowser->header()->resizeSection(i, width_list.at(i).toInt());
}
return true;
}
QLabel* SearchTab::getCurrentLabel() QLabel* SearchTab::getCurrentLabel()
{ {
return results_lbl; return results_lbl;
@@ -184,3 +167,33 @@ void SearchTab::sortSearchListString(int index, Qt::SortOrder sortOrder){
SearchListModel->removeRows(0, nbRows_old); SearchListModel->removeRows(0, nbRows_old);
} }
// Save columns width in a file to remember them
// (download list)
void SearchTab::saveColWidthSearchList() const{
qDebug("Saving columns width in search list");
QSettings settings("qBittorrent", "qBittorrent");
QStringList width_list;
for(int i=0; i<SearchListModel->columnCount(); ++i){
width_list << misc::toQString(resultsBrowser->columnWidth(i));
}
settings.setValue("SearchListColsWidth", width_list.join(" "));
qDebug("Search list columns width saved");
}
// Load columns width in a file that were saved previously
// (search list)
bool SearchTab::loadColWidthSearchList(){
qDebug("Loading columns width for search list");
QSettings settings("qBittorrent", "qBittorrent");
QString line = settings.value("SearchListColsWidth", QString()).toString();
if(line.isEmpty())
return false;
QStringList width_list = line.split(' ');
if(width_list.size() != SearchListModel->columnCount())
return false;
for(int i=0; i<width_list.size(); ++i){
resultsBrowser->header()->resizeSection(i, width_list.at(i).toInt());
}
qDebug("Search list columns width loaded");
return true;
}

View File

@@ -39,7 +39,6 @@
class SearchListDelegate; class SearchListDelegate;
class SearchEngine; class SearchEngine;
class QTreeView; class QTreeView;
class QHeaderView;
class QStandardItemModel; class QStandardItemModel;
class SearchTab : public QWidget, public Ui::search_engine class SearchTab : public QWidget, public Ui::search_engine
@@ -55,17 +54,16 @@ class SearchTab : public QWidget, public Ui::search_engine
public: public:
SearchTab(SearchEngine *parent); SearchTab(SearchEngine *parent);
~SearchTab(); ~SearchTab();
bool loadColWidthResultsList(); bool loadColWidthSearchList();
QLabel * getCurrentLabel(); QLabel * getCurrentLabel();
QStandardItemModel * getCurrentSearchListModel(); QStandardItemModel * getCurrentSearchListModel();
QTreeView * getCurrentTreeView(); QTreeView * getCurrentTreeView();
void setRowColor(int row, QString color); void setRowColor(int row, QString color);
QHeaderView* header() const;
protected slots: protected slots:
void sortSearchList(int index); void sortSearchList(int index);
void sortSearchListInt(int index, Qt::SortOrder sortOrder); void sortSearchListInt(int index, Qt::SortOrder sortOrder);
void sortSearchListString(int index, Qt::SortOrder sortOrder); void sortSearchListString(int index, Qt::SortOrder sortOrder);
void saveColWidthSearchList() const;
}; };

View File

@@ -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>&lt;h3&gt;&lt;b&gt;qBittorrent&lt;/b&gt;&lt;/h3&gt;</string> <string>&lt;h3>&lt;b>qBittorrent&lt;/b>&lt;/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>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <string>A bittorrent client using Qt4 and libtorrent, programmed in C++.&lt;br>
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;br>
p, li { white-space: pre-wrap; } Copyright © 2006 by Christophe Dumez&lt;br>
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'DejaVu Sans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt; &lt;br> &lt;u>Home Page:&lt;/u> &lt;i>http://www.qbittorrent.org&lt;/i>&lt;br></string>
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;A Bittorrent client programmed in C++, based on Qt4 toolkit &lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;and libtorrent-rasterbar. &lt;br /&gt;&lt;br /&gt;Copyright ©2006-2009 Christophe Dumez&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot; text-decoration: underline;&quot;&gt;Home Page:&lt;/span&gt; &lt;a href=&quot;http://www.qbittorrent.org&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;http://www.qbittorrent.org&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</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>

View File

@@ -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>\

View File

@@ -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>

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -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;
@@ -68,7 +67,7 @@ class bittorrent : public QObject {
bool addInPause; bool addInPause;
int maxConnecsPerTorrent; int maxConnecsPerTorrent;
int maxUploadsPerTorrent; int maxUploadsPerTorrent;
float ratio_limit; float max_ratio;
bool UPnPEnabled; bool UPnPEnabled;
bool NATPMPEnabled; bool NATPMPEnabled;
bool LSDEnabled; bool LSDEnabled;
@@ -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,22 +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 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);
@@ -133,13 +128,15 @@ 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 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 setListeningPortsRange(std::pair<unsigned short, unsigned short> ports); void setListeningPortsRange(std::pair<unsigned short, unsigned short> ports);
void setMaxConnections(int maxConnec); void setMaxConnections(int maxConnec);
@@ -154,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);
@@ -166,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:
@@ -181,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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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());

View File

@@ -57,7 +57,6 @@ class torrentCreatorThread : public QThread {
wait(); wait();
} }
void create(QString _input_path, QString _save_path, QStringList _trackers, QStringList _url_seeds, QString _comment, bool _is_private, int _piece_size); void create(QString _input_path, QString _save_path, QStringList _trackers, QStringList _url_seeds, QString _comment, bool _is_private, int _piece_size);
void sendProgressSignal(int progress);
protected: protected:
void run(); void run();
@@ -65,8 +64,6 @@ class torrentCreatorThread : public QThread {
signals: signals:
void creationFailure(QString msg); void creationFailure(QString msg);
void creationSuccess(QString path, const char* branch_path); void creationSuccess(QString path, const char* branch_path);
signals:
void updateProgress(int progress); void updateProgress(int progress);
}; };

View File

@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0" >
<ui version="4.0">
<class>downloading</class> <class>downloading</class>
<widget class="QWidget" name="downloading"> <widget class="QWidget" name="downloading" >
<property name="geometry"> <property name="geometry" >
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
@@ -10,39 +9,39 @@
<height>453</height> <height>453</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle" >
<string>Search</string> <string>Search</string>
</property> </property>
<layout class="QVBoxLayout"> <layout class="QVBoxLayout" >
<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="margin" >
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
<widget class="QTreeView" name="downloadList"> <widget class="QTreeView" name="downloadList" >
<property name="minimumSize"> <property name="minimumSize" >
<size> <size>
<width>0</width> <width>0</width>
<height>0</height> <height>0</height>
</size> </size>
</property> </property>
<property name="contextMenuPolicy"> <property name="contextMenuPolicy" >
<enum>Qt::CustomContextMenu</enum> <enum>Qt::CustomContextMenu</enum>
</property> </property>
<property name="autoScroll"> <property name="autoScroll" >
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="selectionMode"> <property name="selectionMode" >
<enum>QAbstractItemView::ExtendedSelection</enum> <enum>QAbstractItemView::ExtendedSelection</enum>
</property> </property>
<property name="indentation"> <property name="indentation" >
<number>1</number> <number>1</number>
</property> </property>
<property name="itemsExpandable"> <property name="itemsExpandable" >
<bool>false</bool> <bool>false</bool>
</property> </property>
</widget> </widget>
@@ -50,144 +49,139 @@
</layout> </layout>
</item> </item>
</layout> </layout>
<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="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="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="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="actionOpen_destination_folder"> <action name="actionOpen_destination_folder" >
<property name="icon"> <property name="icon" >
<iconset resource="icons.qrc"> <iconset resource="icons.qrc" >
<normaloff>:/Icons/oxygen/folder.png</normaloff>:/Icons/oxygen/folder.png</iconset> <normaloff>:/Icons/folder.png</normaloff>:/Icons/folder.png</iconset>
</property> </property>
<property name="text"> <property name="text" >
<string>Open destination folder</string> <string>Open destination folder</string>
</property> </property>
</action> </action>
<action name="actionHOSColName"> <action name="actionHOSColName" >
<property name="text"> <property name="text" >
<string>Name</string> <string>Name</string>
</property> </property>
</action> </action>
<action name="actionHOSColSize"> <action name="actionHOSColSize" >
<property name="text"> <property name="text" >
<string>Size</string> <string>Size</string>
</property> </property>
</action> </action>
<action name="actionHOSColProgress"> <action name="actionHOSColProgress" >
<property name="text"> <property name="text" >
<string>Progress</string> <string>Progress</string>
</property> </property>
</action> </action>
<action name="actionHOSColDownSpeed"> <action name="actionHOSColDownSpeed" >
<property name="text"> <property name="text" >
<string>DLSpeed</string> <string>DLSpeed</string>
</property> </property>
</action> </action>
<action name="actionHOSColUpSpeed"> <action name="actionHOSColUpSpeed" >
<property name="text"> <property name="text" >
<string>UpSpeed</string> <string>UpSpeed</string>
</property> </property>
</action> </action>
<action name="actionHOSColSeedersLeechers"> <action name="actionHOSColSeedersLeechers" >
<property name="text"> <property name="text" >
<string>Seeds/Leechs</string> <string>Seeds/Leechs</string>
</property> </property>
</action> </action>
<action name="actionHOSColRatio"> <action name="actionHOSColRatio" >
<property name="text"> <property name="text" >
<string>Ratio</string> <string>Ratio</string>
</property> </property>
</action> </action>
<action name="actionHOSColEta"> <action name="actionHOSColEta" >
<property name="text"> <property name="text" >
<string>ETA</string> <string>ETA</string>
</property> </property>
</action> </action>
<action name="actionBuy_it"> <action name="actionBuy_it" >
<property name="icon"> <property name="icon" >
<iconset resource="icons.qrc"> <iconset resource="icons.qrc" >
<normaloff>:/Icons/money.png</normaloff>:/Icons/money.png</iconset> <normaloff>:/Icons/money.png</normaloff>:/Icons/money.png</iconset>
</property> </property>
<property name="text"> <property name="text" >
<string>Buy it</string> <string>Buy it</string>
</property> </property>
</action> </action>
<action name="actionHOSColPriority"> <action name="actionHOSColPriority" >
<property name="text"> <property name="text" >
<string>Priority</string> <string>Priority</string>
</property> </property>
</action> </action>
<action name="actionIncreasePriority"> <action name="actionIncreasePriority" >
<property name="icon"> <property name="icon" >
<iconset resource="icons.qrc"> <iconset resource="icons.qrc" >
<normaloff>:/Icons/skin/increase.png</normaloff>:/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>
</action> </action>
<action name="actionDecreasePriority"> <action name="actionDecreasePriority" >
<property name="icon"> <property name="icon" >
<iconset resource="icons.qrc"> <iconset resource="icons.qrc" >
<normaloff>:/Icons/skin/decrease.png</normaloff>:/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>
</action> </action>
<action name="actionForce_recheck"> <action name="actionForce_recheck" >
<property name="icon"> <property name="icon" >
<iconset resource="icons.qrc"> <iconset resource="icons.qrc" >
<normaloff>:/Icons/oxygen/gear.png</normaloff>:/Icons/oxygen/gear.png</iconset> <normaloff>:/Icons/gear.png</normaloff>:/Icons/gear.png</iconset>
</property> </property>
<property name="text"> <property name="text" >
<string>Force recheck</string> <string>Force recheck</string>
</property> </property>
</action> </action>
<action name="actionCopy_magnet_link">
<property name="text">
<string>Copy magnet link</string>
</property>
</action>
</widget> </widget>
<resources> <resources>
<include location="icons.qrc"/> <include location="icons.qrc" />
</resources> </resources>
<connections/> <connections/>
</ui> </ui>

View File

@@ -36,7 +36,6 @@
#include <QString> #include <QString>
#include <QRegExp> #include <QRegExp>
#include <QStringList> #include <QStringList>
#include <QClipboard>
#include "ui_downloadFromURL.h" #include "ui_downloadFromURL.h"
class downloadFromURL : public QDialog, private Ui::downloadFromURL{ class downloadFromURL : public QDialog, private Ui::downloadFromURL{
@@ -48,11 +47,6 @@ class downloadFromURL : public QDialog, private Ui::downloadFromURL{
setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose);
icon_lbl->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/url.png"))); icon_lbl->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/url.png")));
show(); show();
// Paste clipboard if there is an URL in it
QString clip_txt = qApp->clipboard()->text();
if(clip_txt.startsWith("http://", Qt::CaseInsensitive) || clip_txt.startsWith("https://", Qt::CaseInsensitive) || clip_txt.startsWith("ftp://", Qt::CaseInsensitive) || clip_txt.startsWith("magnet:", Qt::CaseInsensitive)) {
textUrls->setText(clip_txt);
}
} }
~downloadFromURL(){} ~downloadFromURL(){}

View File

@@ -84,7 +84,7 @@ void subDownloadThread::run(){
filePath = tmpfile->fileName(); filePath = tmpfile->fileName();
} }
delete tmpfile; delete tmpfile;
FILE *f = fopen(filePath.toLocal8Bit().data(), "wb"); FILE *f = fopen(filePath.toUtf8().data(), "wb");
if(!f) { if(!f) {
std::cerr << "couldn't open destination file" << "\n"; std::cerr << "couldn't open destination file" << "\n";
return; return;
@@ -93,7 +93,7 @@ void subDownloadThread::run(){
CURLcode res = (CURLcode)-1; CURLcode res = (CURLcode)-1;
curl = curl_easy_init(); curl = curl_easy_init();
if(curl) { if(curl) {
std::string c_url = url.toLocal8Bit().data(); std::string c_url = url.toUtf8().data();
curl_easy_setopt(curl, CURLOPT_URL, c_url.c_str()); curl_easy_setopt(curl, CURLOPT_URL, c_url.c_str());
// SSL support // SSL support
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
@@ -105,8 +105,8 @@ void subDownloadThread::run(){
// Proxy enabled // Proxy enabled
QString IP = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/IP"), "0.0.0.0").toString(); QString IP = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/IP"), "0.0.0.0").toString();
QString port = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Port"), 8080).toString(); QString port = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Port"), 8080).toString();
qDebug("Using proxy: %s", (IP+QString(":")+port).toLocal8Bit().data()); qDebug("Using proxy: %s", (IP+QString(":")+port).toUtf8().data());
curl_easy_setopt(curl, CURLOPT_PROXYPORT, (IP+QString(":")+port).toLocal8Bit().data()); curl_easy_setopt(curl, CURLOPT_PROXYPORT, (IP+QString(":")+port).toUtf8().data());
// Default proxy type is HTTP, we must change if it is SOCKS5 // Default proxy type is HTTP, we must change if it is SOCKS5
if(intValue%2==0) { if(intValue%2==0) {
qDebug("Proxy is SOCKS5, not HTTP"); qDebug("Proxy is SOCKS5, not HTTP");
@@ -117,7 +117,7 @@ void subDownloadThread::run(){
qDebug("Proxy requires authentication, authenticating"); qDebug("Proxy requires authentication, authenticating");
QString username = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Username"), QString()).toString(); QString username = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Username"), QString()).toString();
QString password = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Password"), QString()).toString(); QString password = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Password"), QString()).toString();
curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, (username+QString(":")+password).toLocal8Bit().data()); curl_easy_setopt(curl, CURLOPT_PROXYUSERPWD, (username+QString(":")+password).toUtf8().data());
} }
} }
// We have to define CURLOPT_WRITEFUNCTION or it will crash on windows // We have to define CURLOPT_WRITEFUNCTION or it will crash on windows
@@ -131,7 +131,7 @@ void subDownloadThread::run(){
curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1); curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, -1); curl_easy_setopt(curl, CURLOPT_MAXREDIRS, -1);
qDebug("Downloading %s", url.toLocal8Bit().data()); qDebug("Downloading %s", url.toUtf8().data());
if(!abort) if(!abort)
res = curl_easy_perform(curl); res = curl_easy_perform(curl);
/* always cleanup */ /* always cleanup */
@@ -158,9 +158,7 @@ downloadThread::~downloadThread(){
abort = true; abort = true;
condition.wakeOne(); condition.wakeOne();
mutex.unlock(); mutex.unlock();
//qDebug("downloadThread deleting subthreads...");
qDeleteAll(subThreads); qDeleteAll(subThreads);
//qDebug("downloadThread deleted subthreads");
wait(); wait();
} }
@@ -176,36 +174,28 @@ void downloadThread::downloadUrl(QString url){
void downloadThread::run(){ void downloadThread::run(){
forever{ forever{
if(abort) { if(abort)
qDebug("DownloadThread aborting...");
return; return;
}
mutex.lock(); mutex.lock();
if(!urls_queue.empty() && subThreads.size() < MAX_THREADS){ if(!urls_queue.empty() && subThreads.size() < MAX_THREADS){
QString url = urls_queue.dequeue(); QString url = urls_queue.dequeue();
mutex.unlock(); mutex.unlock();
//qDebug("DownloadThread downloading %s...", url.toLocal8Bit().data());
subDownloadThread *st = new subDownloadThread(0, url); subDownloadThread *st = new subDownloadThread(0, url);
subThreads << st; subThreads << st;
connect(st, SIGNAL(downloadFinishedST(subDownloadThread*, QString, QString)), this, SLOT(propagateDownloadedFile(subDownloadThread*, QString, QString))); connect(st, SIGNAL(downloadFinishedST(subDownloadThread*, QString, QString)), this, SLOT(propagateDownloadedFile(subDownloadThread*, QString, QString)));
connect(st, SIGNAL(downloadFailureST(subDownloadThread*, QString, QString)), this, SLOT(propagateDownloadFailure(subDownloadThread*, QString, QString))); connect(st, SIGNAL(downloadFailureST(subDownloadThread*, QString, QString)), this, SLOT(propagateDownloadFailure(subDownloadThread*, QString, QString)));
st->start(); st->start();
}else{ }else{
//qDebug("DownloadThread sleeping...");
condition.wait(&mutex); condition.wait(&mutex);
//qDebug("DownloadThread woke up");
mutex.unlock(); mutex.unlock();
} }
} }
} }
void downloadThread::propagateDownloadedFile(subDownloadThread* st, QString url, QString path){ void downloadThread::propagateDownloadedFile(subDownloadThread* st, QString url, QString path){
qDebug("Downloading %s was successful", url.toLocal8Bit().data());
mutex.lock();
int index = subThreads.indexOf(st); int index = subThreads.indexOf(st);
Q_ASSERT(index != -1); Q_ASSERT(index != -1);
subThreads.removeAt(index); subThreads.removeAt(index);
mutex.unlock();
delete st; delete st;
emit downloadFinished(url, path); emit downloadFinished(url, path);
mutex.lock(); mutex.lock();
@@ -216,12 +206,9 @@ void downloadThread::propagateDownloadedFile(subDownloadThread* st, QString url,
} }
void downloadThread::propagateDownloadFailure(subDownloadThread* st, QString url, QString reason){ void downloadThread::propagateDownloadFailure(subDownloadThread* st, QString url, QString reason){
qDebug("Downloading %s failed", url.toLocal8Bit().data());
mutex.lock();
int index = subThreads.indexOf(st); int index = subThreads.indexOf(st);
Q_ASSERT(index != -1); Q_ASSERT(index != -1);
subThreads.removeAt(index); subThreads.removeAt(index);
mutex.unlock();
delete st; delete st;
emit downloadFailure(url, reason); emit downloadFailure(url, reason);
mutex.lock(); mutex.lock();

View File

@@ -53,9 +53,8 @@ DownloadingTorrents::DownloadingTorrents(QObject *parent, bittorrent *BTSession)
actionSet_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))); actionSet_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png")));
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")));
actionCopy_magnet_link->setIcon(QIcon(QString::fromUtf8(":/Icons/magnet.png"))); // tabBottom->setTabIcon(0, QIcon(QString::fromUtf8(":/Icons/log.png")));
// tabBottom->setTabIcon(0, QIcon(QString::fromUtf8(":/Icons/oxygen/log.png"))); // tabBottom->setTabIcon(1, QIcon(QString::fromUtf8(":/Icons/filter.png")));
// tabBottom->setTabIcon(1, QIcon(QString::fromUtf8(":/Icons/oxygen/filter.png")));
// Set Download list model // Set Download list model
DLListModel = new QStandardItemModel(0,10); DLListModel = new QStandardItemModel(0,10);
@@ -69,8 +68,6 @@ DownloadingTorrents::DownloadingTorrents(QObject *parent, bittorrent *BTSession)
DLListModel->setHeaderData(ETA, Qt::Horizontal, tr("ETA", "i.e: Estimated Time of Arrival / Time left")); DLListModel->setHeaderData(ETA, Qt::Horizontal, tr("ETA", "i.e: Estimated Time of Arrival / Time left"));
DLListModel->setHeaderData(PRIORITY, Qt::Horizontal, tr("Priority")); DLListModel->setHeaderData(PRIORITY, Qt::Horizontal, tr("Priority"));
downloadList->setModel(DLListModel); downloadList->setModel(DLListModel);
downloadList->setRootIsDecorated(false);
downloadList->setAllColumnsShowFocus(true);
DLDelegate = new DLListDelegate(downloadList); DLDelegate = new DLListDelegate(downloadList);
downloadList->setItemDelegate(DLDelegate); downloadList->setItemDelegate(DLDelegate);
// Hide priority column // Hide priority column
@@ -80,7 +77,6 @@ DownloadingTorrents::DownloadingTorrents(QObject *parent, bittorrent *BTSession)
loadHiddenColumns(); loadHiddenColumns();
connect(BTSession, SIGNAL(torrentFinishedChecking(QTorrentHandle&)), this, SLOT(sortProgressColumn(QTorrentHandle&))); connect(BTSession, SIGNAL(torrentFinishedChecking(QTorrentHandle&)), this, SLOT(sortProgressColumn(QTorrentHandle&)));
connect(BTSession, SIGNAL(metadataReceived(QTorrentHandle&)), this, SLOT(updateMetadata(QTorrentHandle&)));
// Load last columns width for download list // Load last columns width for download list
if(!loadColWidthDLList()) { if(!loadColWidthDLList()) {
@@ -107,7 +103,6 @@ DownloadingTorrents::DownloadingTorrents(QObject *parent, bittorrent *BTSession)
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(actionBuy_it, SIGNAL(triggered()), (GUI*)parent, SLOT(goBuyPage())); connect(actionBuy_it, SIGNAL(triggered()), (GUI*)parent, SLOT(goBuyPage()));
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()));
@@ -176,12 +171,10 @@ void DownloadingTorrents::showProperties(const QModelIndex &index) {
void DownloadingTorrents::showPropertiesFromHash(QString hash) { void DownloadingTorrents::showPropertiesFromHash(QString hash) {
QTorrentHandle h = BTSession->getTorrentHandle(hash); QTorrentHandle h = BTSession->getTorrentHandle(hash);
if(h.is_valid() && h.has_metadata()) { properties *prop = new properties(this, BTSession, h);
properties *prop = new properties(this, BTSession, h); connect(prop, SIGNAL(filteredFilesChanged(QString)), this, SLOT(updateFileSizeAndProgress(QString)));
connect(prop, SIGNAL(filteredFilesChanged(QString)), this, SLOT(updateFileSizeAndProgress(QString))); connect(prop, SIGNAL(trackersChanged(QString)), BTSession, SLOT(saveTrackerFile(QString)));
connect(prop, SIGNAL(trackersChanged(QString)), BTSession, SLOT(saveTrackerFile(QString))); prop->show();
prop->show();
}
} }
// Remove a torrent from the download list but NOT from the BT Session // Remove a torrent from the download list but NOT from the BT Session
@@ -233,35 +226,28 @@ void DownloadingTorrents::propertiesSelection(){
} }
void DownloadingTorrents::forceRecheck() { void DownloadingTorrents::forceRecheck() {
QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes();
foreach(const QModelIndex &index, selectedIndexes){ foreach(const QModelIndex &index, selectedIndexes){
if(index.column() == NAME){ if(index.column() == NAME){
QString hash = DLListModel->data(DLListModel->index(index.row(), HASH)).toString(); QString hash = DLListModel->data(DLListModel->index(index.row(), HASH)).toString();
QTorrentHandle h = BTSession->getTorrentHandle(hash); QTorrentHandle h = BTSession->getTorrentHandle(hash);
if(h.is_valid() && h.has_metadata()) h.force_recheck();
h.force_recheck(); }
} }
}
} }
void DownloadingTorrents::displayDLListMenu(const QPoint&) { void DownloadingTorrents::displayDLListMenu(const QPoint& pos) {
QMenu myDLLlistMenu(this); QMenu myDLLlistMenu(this);
// Enable/disable pause/start action given the DL state // Enable/disable pause/start action given the DL state
QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes();
bool has_pause = false, has_start = false, has_preview = false; bool has_pause = false, has_start = false, has_preview = false;
bool one_has_metadata = false;
QTorrentHandle h;
qDebug("Displaying menu");
foreach(const QModelIndex &index, selectedIndexes) { foreach(const QModelIndex &index, selectedIndexes) {
if(index.column() == NAME) { if(index.column() == NAME) {
// Get the file name // Get the file name
QString hash = DLListModel->data(DLListModel->index(index.row(), HASH)).toString(); QString hash = DLListModel->data(DLListModel->index(index.row(), HASH)).toString();
// Get handle and pause the torrent // Get handle and pause the torrent
h = BTSession->getTorrentHandle(hash); QTorrentHandle h = BTSession->getTorrentHandle(hash);
if(!h.is_valid()) continue; if(!h.is_valid()) continue;
if(h.has_metadata()) {
one_has_metadata = true;
}
if(h.is_paused()) { if(h.is_paused()) {
if(!has_start) { if(!has_start) {
myDLLlistMenu.addAction(actionStart); myDLLlistMenu.addAction(actionStart);
@@ -273,9 +259,9 @@ void DownloadingTorrents::displayDLListMenu(const QPoint&) {
has_pause = true; has_pause = true;
} }
} }
if(h.has_metadata() && BTSession->isFilePreviewPossible(hash) && !has_preview) { if(BTSession->isFilePreviewPossible(hash) && !has_preview) {
myDLLlistMenu.addAction(actionPreview_file); myDLLlistMenu.addAction(actionPreview_file);
has_preview = true; has_preview = true;
} }
if(has_pause && has_start && has_preview) break; if(has_pause && has_start && has_preview) break;
} }
@@ -287,23 +273,20 @@ void DownloadingTorrents::displayDLListMenu(const QPoint&) {
myDLLlistMenu.addAction(actionSet_download_limit); myDLLlistMenu.addAction(actionSet_download_limit);
myDLLlistMenu.addAction(actionSet_upload_limit); myDLLlistMenu.addAction(actionSet_upload_limit);
myDLLlistMenu.addSeparator(); myDLLlistMenu.addSeparator();
if(one_has_metadata) { myDLLlistMenu.addAction(actionForce_recheck);
myDLLlistMenu.addAction(actionForce_recheck); myDLLlistMenu.addSeparator();
myDLLlistMenu.addSeparator();
}
myDLLlistMenu.addAction(actionOpen_destination_folder); myDLLlistMenu.addAction(actionOpen_destination_folder);
if(one_has_metadata) myDLLlistMenu.addAction(actionTorrent_Properties);
myDLLlistMenu.addAction(actionTorrent_Properties);
if(BTSession->isQueueingEnabled()) { if(BTSession->isQueueingEnabled()) {
myDLLlistMenu.addSeparator(); myDLLlistMenu.addSeparator();
myDLLlistMenu.addAction(actionIncreasePriority); myDLLlistMenu.addAction(actionIncreasePriority);
myDLLlistMenu.addAction(actionDecreasePriority); myDLLlistMenu.addAction(actionDecreasePriority);
} }
myDLLlistMenu.addSeparator(); myDLLlistMenu.addSeparator();
myDLLlistMenu.addAction(actionCopy_magnet_link);
myDLLlistMenu.addAction(actionBuy_it); myDLLlistMenu.addAction(actionBuy_it);
// Call menu // Call menu
myDLLlistMenu.exec(QCursor::pos()); // XXX: why mapToGlobal() is not enough?
myDLLlistMenu.exec(mapToGlobal(pos)+QPoint(10,35));
} }
@@ -343,12 +326,12 @@ void DownloadingTorrents::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.
downloadList->setColumnHidden(index, true); downloadList->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
downloadList->setColumnHidden(index, false); downloadList->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
@@ -362,9 +345,9 @@ void DownloadingTorrents::hideOrShowColumn(int index) {
void DownloadingTorrents::hidePriorityColumn(bool hide) { void DownloadingTorrents::hidePriorityColumn(bool hide) {
downloadList->setColumnHidden(PRIORITY, hide); downloadList->setColumnHidden(PRIORITY, hide);
if(hide) if(hide)
getActionHoSCol(PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); getActionHoSCol(PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_cancel.png")));
else else
getActionHoSCol(PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); getActionHoSCol(PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/button_ok.png")));
} }
// save the hidden columns in settings // save the hidden columns in settings
@@ -394,7 +377,7 @@ bool DownloadingTorrents::loadHiddenColumns() {
if(ishidden_list.size() == DLListModel->columnCount()-1) { if(ishidden_list.size() == DLListModel->columnCount()-1) {
unsigned int listSize = ishidden_list.size(); unsigned int listSize = ishidden_list.size();
for(unsigned int i=0; i<listSize; ++i){ for(unsigned int i=0; i<listSize; ++i){
downloadList->header()->resizeSection(i, ishidden_list.at(i).toInt()); downloadList->header()->resizeSection(i, ishidden_list.at(i).toInt());
} }
loaded = true; loaded = true;
} }
@@ -402,9 +385,9 @@ bool DownloadingTorrents::loadHiddenColumns() {
for(int i=0; i<DLListModel->columnCount()-1; i++) { for(int i=0; i<DLListModel->columnCount()-1; i++) {
if(loaded && ishidden_list.at(i) == "0") { if(loaded && ishidden_list.at(i) == "0") {
downloadList->setColumnHidden(i, true); downloadList->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;
@@ -449,36 +432,36 @@ void DownloadingTorrents::hideOrShowColumnPriority() {
// getter, return the action hide or show whose id is index // getter, return the action hide or show whose id is index
QAction* DownloadingTorrents::getActionHoSCol(int index) { QAction* DownloadingTorrents::getActionHoSCol(int index) {
switch(index) { switch(index) {
case NAME : case NAME :
return actionHOSColName; return actionHOSColName;
break; break;
case SIZE : case SIZE :
return actionHOSColSize; return actionHOSColSize;
break; break;
case PROGRESS : case PROGRESS :
return actionHOSColProgress; return actionHOSColProgress;
break; break;
case DLSPEED : case DLSPEED :
return actionHOSColDownSpeed; return actionHOSColDownSpeed;
break; break;
case UPSPEED : case UPSPEED :
return actionHOSColUpSpeed; return actionHOSColUpSpeed;
break; break;
case SEEDSLEECH : case SEEDSLEECH :
return actionHOSColSeedersLeechers; return actionHOSColSeedersLeechers;
break; break;
case RATIO : case RATIO :
return actionHOSColRatio; return actionHOSColRatio;
break; break;
case ETA : case ETA :
return actionHOSColEta; return actionHOSColEta;
break; break;
case PRIORITY : case PRIORITY :
return actionHOSColPriority; return actionHOSColPriority;
break; break;
default : default :
return NULL; return NULL;
} }
} }
QStringList DownloadingTorrents::getSelectedTorrents(bool only_one) const{ QStringList DownloadingTorrents::getSelectedTorrents(bool only_one) const{
@@ -495,113 +478,96 @@ QStringList DownloadingTorrents::getSelectedTorrents(bool only_one) const{
return res; return res;
} }
void DownloadingTorrents::updateMetadata(QTorrentHandle &h) {
QString hash = h.hash();
int row = getRowFromHash(hash);
if(row != -1) {
qDebug("Updating torrent metadata in download list");
DLListModel->setData(DLListModel->index(row, NAME), QVariant(h.name()));
DLListModel->setData(DLListModel->index(row, SIZE), QVariant((qlonglong)h.actual_size()));
}
}
// get information from torrent handles and // get information from torrent handles and
// update download list accordingly // update download list accordingly
bool DownloadingTorrents::updateTorrent(QTorrentHandle h) { bool DownloadingTorrents::updateTorrent(QTorrentHandle h) {
if(!h.is_valid()) return false; bool added = false;
bool added = false; try{
try{ QString hash = h.hash();
QString hash = h.hash(); int row = getRowFromHash(hash);
int row = getRowFromHash(hash); if(row == -1) {
if(row == -1) { qDebug("Info: Could not find filename in download list, adding it...");
qDebug("Info: Could not find filename in download list, adding it..."); addTorrent(hash);
addTorrent(hash); row = getRowFromHash(hash);
row = getRowFromHash(hash); added = true;
added = true; }
} Q_ASSERT(row != -1);
Q_ASSERT(row != -1); // Update Priority
// Update Priority if(BTSession->isQueueingEnabled()) {
if(BTSession->isQueueingEnabled()) { DLListModel->setData(DLListModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash)));
DLListModel->setData(DLListModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash))); if(h.is_queued()) {
if(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) { DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/time.png"))), Qt::DecorationRole);
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole); if(!downloadList->isColumnHidden(PROGRESS)) {
if(!downloadList->isColumnHidden(PROGRESS)) { DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress()));
DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress())); }
}else {
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole);
if(!downloadList->isColumnHidden(ETA)) {
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1));
}
}
// Reset speeds and seeds/leech
DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)0.));
DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.));
DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant("0/0"));
setRowColor(row, QString::fromUtf8("grey"));
return added;
} }
}else { }
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole); if(!downloadList->isColumnHidden(PROGRESS))
DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress()));
// No need to update a paused torrent
if(h.is_paused()) return added;
// Parse download state
// Setting download state
switch(h.state()) {
case torrent_status::checking_files:
case torrent_status::queued_for_checking:
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/time.png"))), Qt::DecorationRole);
setRowColor(row, QString::fromUtf8("grey"));
break;
case torrent_status::downloading:
case torrent_status::downloading_metadata:
if(h.download_payload_rate() > 0) {
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))), Qt::DecorationRole);
if(!downloadList->isColumnHidden(ETA)) {
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)BTSession->getETA(hash)));
}
setRowColor(row, QString::fromUtf8("green"));
}else{
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/stalled.png"))), Qt::DecorationRole);
if(!downloadList->isColumnHidden(ETA)) {
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1));
}
setRowColor(row, QApplication::palette().color(QPalette::WindowText));
}
if(!downloadList->isColumnHidden(DLSPEED)) {
DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)h.download_payload_rate()));
}
if(!downloadList->isColumnHidden(UPSPEED)) {
DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)h.upload_payload_rate()));
}
break;
default:
if(!downloadList->isColumnHidden(ETA)) { if(!downloadList->isColumnHidden(ETA)) {
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1));
} }
}
// Reset speeds and seeds/leech
DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)0.));
DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.));
DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant("0/0"));
setRowColor(row, QString::fromUtf8("grey"));
return added;
} }
} if(!downloadList->isColumnHidden(SEEDSLEECH)) {
if(!downloadList->isColumnHidden(PROGRESS)) DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant(misc::toQString(h.num_seeds(), true)+QString::fromUtf8("/")+misc::toQString(h.num_peers() - h.num_seeds(), true)));
DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress()));
// No need to update a paused torrent
if(h.is_paused()) return added;
// Parse download state
// Setting download state
switch(h.state()) {
case torrent_status::checking_files:
case torrent_status::queued_for_checking:
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole);
setRowColor(row, QString::fromUtf8("grey"));
break;
case torrent_status::downloading:
case torrent_status::downloading_metadata:
if(h.download_payload_rate() > 0) {
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))), Qt::DecorationRole);
if(!downloadList->isColumnHidden(ETA)) {
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)BTSession->getETA(hash)));
}
setRowColor(row, QString::fromUtf8("green"));
}else{
DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/stalled.png"))), Qt::DecorationRole);
if(!downloadList->isColumnHidden(ETA)) {
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1));
}
setRowColor(row, QApplication::palette().color(QPalette::WindowText));
} }
if(!downloadList->isColumnHidden(DLSPEED)) { if(!downloadList->isColumnHidden(RATIO)) {
DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)h.download_payload_rate())); DLListModel->setData(DLListModel->index(row, RATIO), QVariant(misc::toQString(BTSession->getRealRatio(hash))));
} }
if(!downloadList->isColumnHidden(UPSPEED)) { }catch(invalid_handle e) {}
DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)h.upload_payload_rate())); return added;
}
break;
default:
if(!downloadList->isColumnHidden(ETA)) {
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1));
}
}
if(!downloadList->isColumnHidden(SEEDSLEECH)) {
QString tmp = misc::toQString(h.num_seeds(), true);
if(h.num_complete() >= 0)
tmp.append(QString("(")+misc::toQString(h.num_complete())+QString(")"));
tmp.append(QString("/")+misc::toQString(h.num_peers() - h.num_seeds(), true));
if(h.num_incomplete() >= 0)
tmp.append(QString("(")+misc::toQString(h.num_incomplete())+QString(")"));
DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant(tmp));
}
if(!downloadList->isColumnHidden(RATIO)) {
DLListModel->setData(DLListModel->index(row, RATIO), QVariant(misc::toQString(BTSession->getRealRatio(hash))));
}
}catch(invalid_handle e) {}
return added;
} }
void DownloadingTorrents::addTorrent(QString hash) { void DownloadingTorrents::addTorrent(QString hash) {
QTorrentHandle h = BTSession->getTorrentHandle(hash); QTorrentHandle h = BTSession->getTorrentHandle(hash);
int row = getRowFromHash(hash); int row = getRowFromHash(hash);
qDebug("DL: addTorrent(): %s, row: %d", (const char*)hash.toLocal8Bit(), row); qDebug("DL: addTorrent(): %s, row: %d", (const char*)hash.toUtf8(), row);
if(row != -1) return; if(row != -1) return;
row = DLListModel->rowCount(); row = DLListModel->rowCount();
// Adding torrent to download list // Adding torrent to download list
@@ -612,7 +578,6 @@ void DownloadingTorrents::addTorrent(QString hash) {
DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.)); DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.));
DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant(QString::fromUtf8("0/0"))); DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant(QString::fromUtf8("0/0")));
DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress())); DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress()));
DLListModel->setData(DLListModel->index(row, RATIO), QVariant((double)0.));
DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1));
if(BTSession->isQueueingEnabled()) if(BTSession->isQueueingEnabled())
DLListModel->setData(DLListModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash))); DLListModel->setData(DLListModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash)));
@@ -684,17 +649,17 @@ void DownloadingTorrents::toggleDownloadListSortOrder(int index) {
sortOrder = (Qt::SortOrder)!(bool)downloadList->header()->sortIndicatorOrder(); sortOrder = (Qt::SortOrder)!(bool)downloadList->header()->sortIndicatorOrder();
} }
switch(index) { switch(index) {
case SIZE: case SIZE:
case ETA: case ETA:
case UPSPEED: case UPSPEED:
case DLSPEED: case DLSPEED:
case PROGRESS: case PROGRESS:
case PRIORITY: case PRIORITY:
case RATIO: case RATIO:
sortDownloadListFloat(index, sortOrder); sortDownloadListFloat(index, sortOrder);
break; break;
default: default:
sortDownloadListString(index, sortOrder); sortDownloadListString(index, sortOrder);
} }
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
QString sortOrderLetter; QString sortOrderLetter;
@@ -726,16 +691,16 @@ void DownloadingTorrents::sortDownloadList(int index, Qt::SortOrder sortOrder) {
downloadList->header()->setSortIndicator(index, sortOrder); downloadList->header()->setSortIndicator(index, sortOrder);
} }
switch(index) { switch(index) {
case SIZE: case SIZE:
case ETA: case ETA:
case UPSPEED: case UPSPEED:
case DLSPEED: case DLSPEED:
case PRIORITY: case PRIORITY:
case PROGRESS: case PROGRESS:
sortDownloadListFloat(index, sortOrder); sortDownloadListFloat(index, sortOrder);
break; break;
default: default:
sortDownloadListString(index, sortOrder); sortDownloadListString(index, sortOrder);
} }
} }
@@ -752,7 +717,7 @@ void DownloadingTorrents::saveColWidthDLList() const{
width_list = line.split(' '); width_list = line.split(' ');
} }
for(short i=0; i<nbColumns; ++i){ for(short i=0; i<nbColumns; ++i){
if(downloadList->columnWidth(i)<1 && width_list.size() == nbColumns && width_list.at(i).toInt()>=1) { if(downloadList->columnWidth(i)<1 && width_list.size() == DLListModel->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(downloadList->columnWidth(i)>=1) { } else if(downloadList->columnWidth(i)>=1) {
@@ -765,11 +730,6 @@ void DownloadingTorrents::saveColWidthDLList() const{
} }
} }
settings.setValue(QString::fromUtf8("DownloadListColsWidth"), new_width_list.join(QString::fromUtf8(" "))); settings.setValue(QString::fromUtf8("DownloadListColsWidth"), new_width_list.join(QString::fromUtf8(" ")));
QVariantList visualIndexes;
for(int i=0; i<nbColumns; ++i) {
visualIndexes.append(downloadList->header()->visualIndex(i));
}
settings.setValue(QString::fromUtf8("DownloadListVisualIndexes"), visualIndexes);
qDebug("Download list columns width saved"); qDebug("Download list columns width saved");
} }
@@ -788,25 +748,8 @@ bool DownloadingTorrents::loadColWidthDLList() {
} }
unsigned int listSize = width_list.size(); unsigned int listSize = width_list.size();
for(unsigned int i=0; i<listSize; ++i) { for(unsigned int i=0; i<listSize; ++i) {
downloadList->header()->resizeSection(i, width_list.at(i).toInt()); downloadList->header()->resizeSection(i, width_list.at(i).toInt());
} }
QVariantList visualIndexes = settings.value(QString::fromUtf8("DownloadListVisualIndexes"), QVariantList()).toList();
if(visualIndexes.size() != DLListModel->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(downloadList->header()->logicalIndex(i)).toInt();
if(i != new_visual_index) {
qDebug("Moving column from %d to %d", downloadList->header()->logicalIndex(i), new_visual_index);
downloadList->header()->moveSection(i, new_visual_index);
change = true;
}
}
}while(change);
qDebug("Download list columns width loaded"); qDebug("Download list columns width loaded");
return true; return true;
} }

View File

@@ -103,7 +103,6 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{
void sortProgressColumn(QTorrentHandle& h); void sortProgressColumn(QTorrentHandle& h);
void loadLastSortedColumn(); void loadLastSortedColumn();
void addTorrent(QString hash); void addTorrent(QString hash);
void updateMetadata(QTorrentHandle &h);
}; };

View File

@@ -57,9 +57,9 @@ engineSelectDlg::engineSelectDlg(QWidget *parent) : QDialog(parent) {
pluginsTree->header()->resizeSection(0, 170); pluginsTree->header()->resizeSection(0, 170);
pluginsTree->header()->resizeSection(1, 220); pluginsTree->header()->resizeSection(1, 220);
pluginsTree->hideColumn(ENGINE_ID); pluginsTree->hideColumn(ENGINE_ID);
actionEnable->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); actionEnable->setIcon(QIcon(QString::fromUtf8(":/Icons/button_ok.png")));
actionDisable->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); actionDisable->setIcon(QIcon(QString::fromUtf8(":/Icons/button_cancel.png")));
actionUninstall->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-remove.png"))); actionUninstall->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/remove.png")));
connect(actionEnable, SIGNAL(triggered()), this, SLOT(enableSelection())); connect(actionEnable, SIGNAL(triggered()), this, SLOT(enableSelection()));
connect(actionDisable, SIGNAL(triggered()), this, SLOT(disableSelection())); connect(actionDisable, SIGNAL(triggered()), this, SLOT(disableSelection()));
connect(pluginsTree, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayContextMenu(const QPoint&))); connect(pluginsTree, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayContextMenu(const QPoint&)));
@@ -85,7 +85,7 @@ void engineSelectDlg::dropEvent(QDropEvent *event) {
QStringList files=event->mimeData()->text().split(QString::fromUtf8("\n")); QStringList files=event->mimeData()->text().split(QString::fromUtf8("\n"));
QString file; QString file;
foreach(file, files) { foreach(file, files) {
qDebug("dropped %s", file.toLocal8Bit().data()); qDebug("dropped %s", file.toUtf8().data());
file = file.replace("file://", ""); file = file.replace("file://", "");
if(file.startsWith("http://", Qt::CaseInsensitive) || file.startsWith("https://", Qt::CaseInsensitive) || file.startsWith("ftp://", Qt::CaseInsensitive)) { if(file.startsWith("http://", Qt::CaseInsensitive) || file.startsWith("https://", Qt::CaseInsensitive) || file.startsWith("ftp://", Qt::CaseInsensitive)) {
downloader->downloadUrl(file); downloader->downloadUrl(file);
@@ -108,7 +108,7 @@ void engineSelectDlg::dropEvent(QDropEvent *event) {
void engineSelectDlg::dragEnterEvent(QDragEnterEvent *event) { void engineSelectDlg::dragEnterEvent(QDragEnterEvent *event) {
QString mime; QString mime;
foreach(mime, event->mimeData()->formats()){ foreach(mime, event->mimeData()->formats()){
qDebug("mimeData: %s", mime.toLocal8Bit().data()); qDebug("mimeData: %s", mime.toUtf8().data());
} }
if (event->mimeData()->hasFormat(QString::fromUtf8("text/plain")) || event->mimeData()->hasFormat(QString::fromUtf8("text/uri-list"))) { if (event->mimeData()->hasFormat(QString::fromUtf8("text/plain")) || event->mimeData()->hasFormat(QString::fromUtf8("text/uri-list"))) {
event->acceptProposedAction(); event->acceptProposedAction();
@@ -123,7 +123,7 @@ void engineSelectDlg::saveSettings() {
foreach(engine, installed_engines.keys()) { foreach(engine, installed_engines.keys()) {
known_engines << engine; known_engines << engine;
known_enginesEnabled << QVariant(installed_engines.value(engine, true)); known_enginesEnabled << QVariant(installed_engines.value(engine, true));
qDebug("Engine %s has state: %d", engine.toLocal8Bit().data(), installed_engines.value(engine, true)); qDebug("Engine %s has state: %d", engine.toUtf8().data(), installed_engines.value(engine, true));
} }
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
settings.setValue(QString::fromUtf8("SearchEngines/knownEngines"), known_engines); settings.setValue(QString::fromUtf8("SearchEngines/knownEngines"), known_engines);
@@ -264,7 +264,7 @@ bool engineSelectDlg::checkInstalled(QString plugin_name) const {
result = result.replace("\r", ""); result = result.replace("\r", "");
result = result.replace("\n", ""); result = result.replace("\n", "");
QList<QByteArray> plugins_list = result.split(','); QList<QByteArray> plugins_list = result.split(',');
return plugins_list.contains(plugin_name.toLocal8Bit()); return plugins_list.contains(plugin_name.toUtf8());
} }
void engineSelectDlg::loadSupportedSearchEngines(bool first) { void engineSelectDlg::loadSupportedSearchEngines(bool first) {
@@ -379,7 +379,7 @@ bool engineSelectDlg::isUpdateNeeded(QString plugin_name, float new_version) con
void engineSelectDlg::installZipPlugin(QString path) { void engineSelectDlg::installZipPlugin(QString path) {
QStringList plugins; QStringList plugins;
QStringList favicons; QStringList favicons;
ZZIP_DIR* dir = zzip_dir_open(path.toLocal8Bit().data(), 0); ZZIP_DIR* dir = zzip_dir_open(path.toUtf8().data(), 0);
if(!dir) { if(!dir) {
QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("Search engine plugin archive could not be read.")); QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("Search engine plugin archive could not be read."));
return; return;
@@ -412,8 +412,8 @@ void engineSelectDlg::installZipPlugin(QString path) {
foreach(plugin, plugins) { foreach(plugin, plugins) {
QString plugin_name = plugin.split(QDir::separator()).last(); QString plugin_name = plugin.split(QDir::separator()).last();
plugin_name.chop(3); // Remove .py extension plugin_name.chop(3); // Remove .py extension
qDebug("Detected plugin %s in archive", plugin_name.toLocal8Bit().data()); qDebug("Detected plugin %s in archive", plugin_name.toUtf8().data());
ZZIP_FILE* fp = zzip_file_open(dir, plugin.toLocal8Bit().data(), 0); ZZIP_FILE* fp = zzip_file_open(dir, plugin.toUtf8().data(), 0);
if(fp) { if(fp) {
QTemporaryFile *tmpfile = new QTemporaryFile(); QTemporaryFile *tmpfile = new QTemporaryFile();
QString tmpPath; QString tmpPath;
@@ -430,7 +430,7 @@ void engineSelectDlg::installZipPlugin(QString path) {
tmpfile->close(); tmpfile->close();
} else { } else {
qDebug("Could not open tmp file"); qDebug("Could not open tmp file");
QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
delete tmpfile; delete tmpfile;
continue; continue;
} }
@@ -441,12 +441,12 @@ void engineSelectDlg::installZipPlugin(QString path) {
qDebug("Deleted tmpfile"); qDebug("Deleted tmpfile");
} else { } else {
qDebug("Cannot read file in archive"); qDebug("Cannot read file in archive");
QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
} }
} }
QString favicon; QString favicon;
foreach(favicon, favicons) { foreach(favicon, favicons) {
qDebug("Detected favicon %s in archive", favicon.toLocal8Bit().data()); qDebug("Detected favicon %s in archive", favicon.toUtf8().data());
// Ok we have a favicon here // Ok we have a favicon here
QString plugin_name = favicon.split(QDir::separator()).last(); QString plugin_name = favicon.split(QDir::separator()).last();
plugin_name.chop(4); // Remove .png extension plugin_name.chop(4); // Remove .png extension
@@ -457,7 +457,7 @@ void engineSelectDlg::installZipPlugin(QString path) {
if(QFile::exists(iconPath)) { if(QFile::exists(iconPath)) {
QFile::remove(iconPath); QFile::remove(iconPath);
} }
ZZIP_FILE* fp = zzip_file_open(dir, favicon.toLocal8Bit().data(), 0); ZZIP_FILE* fp = zzip_file_open(dir, favicon.toUtf8().data(), 0);
if(fp) { if(fp) {
QFile dest_icon(iconPath); QFile dest_icon(iconPath);
// Write icon // Write icon
@@ -482,12 +482,12 @@ void engineSelectDlg::installZipPlugin(QString path) {
#endif #endif
void engineSelectDlg::installPlugin(QString path, QString plugin_name) { void engineSelectDlg::installPlugin(QString path, QString plugin_name) {
qDebug("Asked to install plugin at %s", path.toLocal8Bit().data()); qDebug("Asked to install plugin at %s", path.toUtf8().data());
float new_version = misc::getPluginVersion(path); float new_version = misc::getPluginVersion(path);
qDebug("Version to be installed: %.2f", new_version); qDebug("Version to be installed: %.2f", new_version);
if(!isUpdateNeeded(plugin_name, new_version)) { if(!isUpdateNeeded(plugin_name, new_version)) {
qDebug("Apparently update it not needed, we have a more recent version"); qDebug("Apparently update it not needed, we have a more recent version");
QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("A more recent version of %1 search engine plugin is already installed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("A more recent version of %1 search engine plugin is already installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
return; return;
} }
// Process with install // Process with install
@@ -509,12 +509,12 @@ void engineSelectDlg::installPlugin(QString path, QString plugin_name) {
// restore backup // restore backup
QFile::copy(dest_path+".bak", dest_path); QFile::copy(dest_path+".bak", dest_path);
QFile::remove(dest_path+".bak"); QFile::remove(dest_path+".bak");
QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be updated, keeping old version.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be updated, keeping old version.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
return; return;
} else { } else {
// Remove broken file // Remove broken file
QFile::remove(dest_path); QFile::remove(dest_path);
QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); QMessageBox::warning(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin could not be installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
return; return;
} }
} }
@@ -525,10 +525,10 @@ void engineSelectDlg::installPlugin(QString path, QString plugin_name) {
// Refresh plugin list // Refresh plugin list
loadSupportedSearchEngines(); loadSupportedSearchEngines();
if(update) { if(update) {
QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin was successfully updated.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin was successfully updated.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
return; return;
} else { } else {
QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin was successfully installed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); QMessageBox::information(this, tr("Search plugin install")+" -- "+tr("qBittorrent"), tr("%1 search engine plugin was successfully installed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
return; return;
} }
} }
@@ -595,17 +595,17 @@ bool engineSelectDlg::parseVersionsFile(QString versions_file, QString updateSer
plugin_name.chop(1); // remove trailing ':' plugin_name.chop(1); // remove trailing ':'
bool ok; bool ok;
float version = list.last().toFloat(&ok); float version = list.last().toFloat(&ok);
qDebug("read line %s: %.2f", plugin_name.toLocal8Bit().data(), version); qDebug("read line %s: %.2f", plugin_name.toUtf8().data(), version);
if(!ok) continue; if(!ok) continue;
file_correct = true; file_correct = true;
if(isUpdateNeeded(plugin_name, version)) { if(isUpdateNeeded(plugin_name, version)) {
qDebug("Plugin: %s is outdated", plugin_name.toLocal8Bit().data()); qDebug("Plugin: %s is outdated", plugin_name.toUtf8().data());
// Downloading update // Downloading update
downloader->downloadUrl(updateServer+plugin_name+".pyqBT"); // Actually this is really a .py downloader->downloadUrl(updateServer+plugin_name+".pyqBT"); // Actually this is really a .py
downloader->downloadUrl(updateServer+plugin_name+".png"); downloader->downloadUrl(updateServer+plugin_name+".png");
updated = true; updated = true;
}else { }else {
qDebug("Plugin: %s is up to date", plugin_name.toLocal8Bit().data()); qDebug("Plugin: %s is up to date", plugin_name.toUtf8().data());
} }
} }
// Close file // Close file
@@ -619,7 +619,7 @@ bool engineSelectDlg::parseVersionsFile(QString versions_file, QString updateSer
} }
void engineSelectDlg::processDownloadedFile(QString url, QString filePath) { void engineSelectDlg::processDownloadedFile(QString url, QString filePath) {
qDebug("engineSelectDlg received %s", url.toLocal8Bit().data()); qDebug("engineSelectDlg received %s", url.toUtf8().data());
if(url.endsWith("favicon.ico", Qt::CaseInsensitive)){ if(url.endsWith("favicon.ico", Qt::CaseInsensitive)){
// Icon downloaded // Icon downloaded
QImage fileIcon; QImage fileIcon;
@@ -677,7 +677,7 @@ void engineSelectDlg::processDownloadedFile(QString url, QString filePath) {
void engineSelectDlg::handleDownloadFailure(QString url, QString reason) { void engineSelectDlg::handleDownloadFailure(QString url, QString reason) {
if(url.endsWith("favicon.ico", Qt::CaseInsensitive)){ if(url.endsWith("favicon.ico", Qt::CaseInsensitive)){
qDebug("Could not download favicon: %s, reason: %s", url.toLocal8Bit().data(), reason.toLocal8Bit().data()); qDebug("Could not download favicon: %s, reason: %s", url.toUtf8().data(), reason.toUtf8().data());
return; return;
} }
if(url == "http://www.dchris.eu/search_engine2/versions.txt") { if(url == "http://www.dchris.eu/search_engine2/versions.txt") {
@@ -695,13 +695,13 @@ void engineSelectDlg::handleDownloadFailure(QString url, QString reason) {
QString plugin_name = url.split('/').last(); QString plugin_name = url.split('/').last();
plugin_name.replace(".pyqBT", "", Qt::CaseInsensitive); plugin_name.replace(".pyqBT", "", Qt::CaseInsensitive);
plugin_name.replace(".py", "", Qt::CaseInsensitive); plugin_name.replace(".py", "", Qt::CaseInsensitive);
QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, %1 search plugin install failed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, %1 search plugin install failed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
} }
#ifdef HAVE_ZZIP #ifdef HAVE_ZZIP
if(url.endsWith(".zip", Qt::CaseInsensitive)) { if(url.endsWith(".zip", Qt::CaseInsensitive)) {
QString plugin_name = url.split('/').last(); QString plugin_name = url.split('/').last();
plugin_name.replace(".zip", "", Qt::CaseInsensitive); plugin_name.replace(".zip", "", Qt::CaseInsensitive);
QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, %1 search plugin install failed.", "%1 is the name of the search engine").arg(plugin_name.toLocal8Bit().data())); QMessageBox::warning(this, tr("Search plugin update")+" -- "+tr("qBittorrent"), tr("Sorry, %1 search plugin install failed.", "%1 is the name of the search engine").arg(plugin_name.toUtf8().data()));
} }
#endif #endif
} }

View File

@@ -1,182 +0,0 @@
#ifndef FEEDLIST_H
#define FEEDLIST_H
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QDropEvent>
#include <QDragMoveEvent>
#include <QStringList>
#include <QHash>
#include <QUrl>
#include "rss.h"
class FeedList: public QTreeWidget {
Q_OBJECT
private:
RssManager *rssmanager;
QHash<QTreeWidgetItem*, RssFile*> mapping;
QHash<QString, QTreeWidgetItem*> feeds_items;
QTreeWidgetItem* current_feed;
public:
FeedList(QWidget *parent, RssManager *rssmanager): QTreeWidget(parent), rssmanager(rssmanager) {
setContextMenuPolicy(Qt::CustomContextMenu);
setDragDropMode(QAbstractItemView::InternalMove);
setSelectionMode(QAbstractItemView::ExtendedSelection);
setColumnCount(1);
QTreeWidgetItem *___qtreewidgetitem = headerItem();
___qtreewidgetitem->setText(0, QApplication::translate("RSS", "RSS feeds", 0, QApplication::UnicodeUTF8));
connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(updateCurrentFeed(QTreeWidgetItem*)));
}
void itemAdded(QTreeWidgetItem *item, RssFile* file) {
mapping[item] = file;
if(file->getType() == RssFile::STREAM) {
feeds_items[file->getID()] = item;
if(topLevelItemCount() == 1)
setCurrentItem(item);
}
}
void itemRemoved(QTreeWidgetItem *item) {
RssFile* file = mapping.take(item);
if(file->getType() == RssFile::STREAM)
feeds_items.remove(file->getID());
}
bool hasFeed(QString url) {
return feeds_items.contains(QUrl(url).toString());
}
QList<QTreeWidgetItem*> getAllFeedItems() {
return feeds_items.values();
}
QStringList getItemPath(QTreeWidgetItem* item) {
QStringList path;
if(item) {
if(item->parent())
path.append(getItemPath(item->parent()));
path.append(getRSSItem(item)->getID());
}
return path;
}
QList<QTreeWidgetItem*> getAllOpenFolders(QTreeWidgetItem *parent=0) {
QList<QTreeWidgetItem*> open_folders;
int nbChildren;
if(parent)
nbChildren = parent->childCount();
else
nbChildren = topLevelItemCount();
for(int i=0; i<nbChildren; ++i) {
QTreeWidgetItem *item;
if(parent)
item = parent->child(i);
else
item = topLevelItem(i);
if(getItemType(item) == RssFile::FOLDER && item->isExpanded()) {
QList<QTreeWidgetItem*> open_subfolders = getAllOpenFolders(item);
if(!open_subfolders.empty()) {
open_folders.append(open_subfolders);
} else {
open_folders << item;
}
}
}
return open_folders;
}
QList<QTreeWidgetItem*> getAllFeedItems(QTreeWidgetItem* folder) {
QList<QTreeWidgetItem*> feeds;
int nbChildren = folder->childCount();
for(int i=0; i<nbChildren; ++i) {
QTreeWidgetItem *item = folder->child(i);
if(getItemType(item) == RssFile::STREAM) {
feeds << item;
} else {
feeds.append(getAllFeedItems(item));
}
}
return feeds;
}
RssFile* getRSSItem(QTreeWidgetItem *item) {
return mapping[item];
}
RssFile* getCurrentRSSItem() {
return mapping[current_feed];
}
RssFile::FileType getItemType(QTreeWidgetItem *item) {
return mapping[item]->getType();
}
QString getItemID(QTreeWidgetItem *item) {
return mapping[item]->getID();
}
QTreeWidgetItem* getTreeItemFromUrl(QString url) const{
return feeds_items[url];
}
QTreeWidgetItem* currentItem() const {
return current_feed;
}
QTreeWidgetItem* currentFeed() const {
return current_feed;
}
signals:
void foldersAltered(QList<QTreeWidgetItem*> folders);
protected slots:
void updateCurrentFeed(QTreeWidgetItem* new_item) {
if(getItemType(new_item) == RssFile::STREAM)
current_feed = new_item;
}
protected:
void dragMoveEvent(QDragMoveEvent * event) {
QTreeWidgetItem *item = itemAt(event->pos());
if(item && getItemType(item) != RssFile::FOLDER)
event->ignore();
else {
QTreeWidget::dragMoveEvent(event);
}
}
void dropEvent(QDropEvent *event) {
qDebug("dropEvent");
QList<QTreeWidgetItem*> folders_altered;
QTreeWidgetItem *dest_folder_item = itemAt(event->pos());
RssFolder *dest_folder;
if(dest_folder_item) {
dest_folder = (RssFolder*)getRSSItem(dest_folder_item);
folders_altered << dest_folder_item;
} else {
dest_folder = rssmanager;
}
QList<QTreeWidgetItem *> src_items = selectedItems();
foreach(QTreeWidgetItem *src_item, src_items) {
QTreeWidgetItem *parent_folder = src_item->parent();
if(parent_folder && !folders_altered.contains(parent_folder))
folders_altered << parent_folder;
// Actually move the file
RssFile *file = getRSSItem(src_item);
rssmanager->moveFile(file, dest_folder);
}
QTreeWidget::dropEvent(event);
if(dest_folder_item)
dest_folder_item->setExpanded(true);
// Emit signal for update
if(!folders_altered.empty())
emit foldersAltered(folders_altered);
}
};
#endif // FEEDLIST_H

View File

@@ -191,21 +191,17 @@ class FilterParserThread : public QThread {
if(IPv4) { if(IPv4) {
//IPv4 addresses //IPv4 addresses
IP = strStartIP.split('.'); IP = strStartIP.split('.');
if(IP.size() != 4) address_v4 start((IP.at(0).toInt() << 24) + (IP.at(1).toInt() << 16) + (IP.at(2).toInt() << 8) + IP.at(3).toInt());
throw exception();
address_v4 start((IP.at(0).toUInt() << 24) + (IP.at(1).toUInt() << 16) + (IP.at(2).toUInt() << 8) + IP.at(3).toUInt());
IP = strEndIP.split('.'); IP = strEndIP.split('.');
if(IP.size() != 4) address_v4 last((IP.at(0).toInt() << 24) + (IP.at(1).toInt() << 16) + (IP.at(2).toInt() << 8) + IP.at(3).toInt());
throw exception();
address_v4 last((IP.at(0).toUInt() << 24) + (IP.at(1).toUInt() << 16) + (IP.at(2).toUInt() << 8) + IP.at(3).toUInt());
// Apply to bittorrent session // Apply to bittorrent session
filter.add_rule(start, last, ip_filter::blocked); filter.add_rule(start, last, ip_filter::blocked);
} else { } else {
// IPv6, ex : 1fff:0000:0a88:85a3:0000:0000:ac1f:8001 // IPv6, ex : 1fff:0000:0a88:85a3:0000:0000:ac1f:8001
IP = strStartIP.split(':'); IP = strStartIP.split(':');
address_v6 start = address_v6::from_string(strStartIP.remove(':', 0).toLocal8Bit().data()); address_v6 start = address_v6::from_string(strStartIP.remove(':', 0).toUtf8().data());
IP = strEndIP.split(':'); IP = strEndIP.split(':');
address_v6 last = address_v6::from_string(strEndIP.remove(':', 0).toLocal8Bit().data()); address_v6 last = address_v6::from_string(strEndIP.remove(':', 0).toUtf8().data());
// Apply to bittorrent session // Apply to bittorrent session
filter.add_rule(start, last, ip_filter::blocked); filter.add_rule(start, last, ip_filter::blocked);
} }
@@ -254,9 +250,9 @@ class FilterParserThread : public QThread {
if(strStartIP.contains(is_ipv4) && strEndIP.contains(is_ipv4)) { if(strStartIP.contains(is_ipv4) && strEndIP.contains(is_ipv4)) {
// IPv4 // IPv4
IP = strStartIP.split('.'); IP = strStartIP.split('.');
address_v4 start((IP.at(0).toUInt() << 24) + (IP.at(1).toUInt() << 16) + (IP.at(2).toUInt() << 8) + IP.at(3).toUInt()); address_v4 start((IP.at(0).toInt() << 24) + (IP.at(1).toInt() << 16) + (IP.at(2).toInt() << 8) + IP.at(3).toInt());
IP = strEndIP.split('.'); IP = strEndIP.split('.');
address_v4 last((IP.at(0).toUInt() << 24) + (IP.at(1).toUInt() << 16) + (IP.at(2).toUInt() << 8) + IP.at(3).toUInt()); address_v4 last((IP.at(0).toInt() << 24) + (IP.at(1).toInt() << 16) + (IP.at(2).toInt() << 8) + IP.at(3).toInt());
// Apply to bittorrent session // Apply to bittorrent session
filter.add_rule(start, last, ip_filter::blocked); filter.add_rule(start, last, ip_filter::blocked);
} else { } else {

Some files were not shown because too many files have changed in this diff Show More