From 7792b4f849e6733efa28f4550d7c166d6237e40d Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Fri, 6 Nov 2009 14:30:14 +0000 Subject: [PATCH 01/34] - Branched trunk in order to work on a major GUI remodeling. I will attempt to: * Merge download and upload lists * Display torrent properties in the same tab (horizontal split) --- AUTHORS | 4 +- Changelog | 3 + INSTALL | 14 +- configure | 90 +- doc/qbittorrent.1 | 2 +- qbittorrent.qc | 3 - qcm/libcurl.qcm | 61 - qcm/qt4.qcm | 9 +- src/GUI.cpp | 2684 ++++++++++++++++----------------- src/GUI.h | 14 +- src/about_imp.h | 8 +- src/addTorrentDialog.ui | 7 + src/bittorrent.cpp | 175 ++- src/downloadThread.cpp | 299 ++-- src/downloadThread.h | 68 +- src/engineSelectDlg.cpp | 1 + src/lang/qbittorrent_bg.qm | Bin 67919 -> 66997 bytes src/lang/qbittorrent_bg.ts | 530 ++++--- src/lang/qbittorrent_ca.qm | Bin 17731 -> 17728 bytes src/lang/qbittorrent_ca.ts | 548 ++++--- src/lang/qbittorrent_cs.qm | Bin 67626 -> 66758 bytes src/lang/qbittorrent_cs.ts | 530 ++++--- src/lang/qbittorrent_da.qm | Bin 20145 -> 20142 bytes src/lang/qbittorrent_da.ts | 548 ++++--- src/lang/qbittorrent_de.qm | Bin 58267 -> 57334 bytes src/lang/qbittorrent_de.ts | 532 ++++--- src/lang/qbittorrent_el.qm | Bin 71511 -> 70567 bytes src/lang/qbittorrent_el.ts | 530 ++++--- src/lang/qbittorrent_en.ts | 551 ++++--- src/lang/qbittorrent_es.qm | Bin 50214 -> 49227 bytes src/lang/qbittorrent_es.ts | 532 ++++--- src/lang/qbittorrent_fi.qm | Bin 66881 -> 65933 bytes src/lang/qbittorrent_fi.ts | 530 ++++--- src/lang/qbittorrent_fr.qm | Bin 72295 -> 75659 bytes src/lang/qbittorrent_fr.ts | 534 ++++--- src/lang/qbittorrent_hu.qm | Bin 66147 -> 65247 bytes src/lang/qbittorrent_hu.ts | 530 ++++--- src/lang/qbittorrent_it.qm | Bin 70441 -> 69539 bytes src/lang/qbittorrent_it.ts | 530 ++++--- src/lang/qbittorrent_ja.qm | Bin 38110 -> 37358 bytes src/lang/qbittorrent_ja.ts | 530 ++++--- src/lang/qbittorrent_ko.qm | Bin 56626 -> 55810 bytes src/lang/qbittorrent_ko.ts | 530 ++++--- src/lang/qbittorrent_nb.qm | Bin 20358 -> 20355 bytes src/lang/qbittorrent_nb.ts | 548 ++++--- src/lang/qbittorrent_nl.qm | Bin 67809 -> 66921 bytes src/lang/qbittorrent_nl.ts | 119 +- src/lang/qbittorrent_pl.qm | Bin 49880 -> 49004 bytes src/lang/qbittorrent_pl.ts | 119 +- src/lang/qbittorrent_pt.qm | Bin 69373 -> 68399 bytes src/lang/qbittorrent_pt.ts | 119 +- src/lang/qbittorrent_pt_BR.qm | Bin 69373 -> 68399 bytes src/lang/qbittorrent_pt_BR.ts | 119 +- src/lang/qbittorrent_ro.qm | Bin 68454 -> 67482 bytes src/lang/qbittorrent_ro.ts | 119 +- src/lang/qbittorrent_ru.qm | Bin 69467 -> 68559 bytes src/lang/qbittorrent_ru.ts | 119 +- src/lang/qbittorrent_sk.qm | Bin 69210 -> 68286 bytes src/lang/qbittorrent_sk.ts | 119 +- src/lang/qbittorrent_sv.qm | Bin 68214 -> 67290 bytes src/lang/qbittorrent_sv.ts | 119 +- src/lang/qbittorrent_tr.qm | Bin 67544 -> 66596 bytes src/lang/qbittorrent_tr.ts | 119 +- src/lang/qbittorrent_uk.qm | Bin 45276 -> 44492 bytes src/lang/qbittorrent_uk.ts | 123 +- src/lang/qbittorrent_zh.qm | Bin 51126 -> 50478 bytes src/lang/qbittorrent_zh.ts | 119 +- src/lang/qbittorrent_zh_TW.qm | Bin 52452 -> 51798 bytes src/lang/qbittorrent_zh_TW.ts | 119 +- src/main.cpp | 22 - src/qtorrenthandle.cpp | 9 +- src/qtorrenthandle.h | 3 +- src/rss.cpp | 44 +- src/rss.h | 30 +- src/rss_imp.cpp | 4 +- src/src.pro | 7 +- src/torrentAddition.h | 2 + src/torrentPersistentData.h | 19 + 78 files changed, 7763 insertions(+), 5284 deletions(-) delete mode 100644 qcm/libcurl.qcm diff --git a/AUTHORS b/AUTHORS index 6b33170ec..2cd38abc0 100644 --- a/AUTHORS +++ b/AUTHORS @@ -2,10 +2,10 @@ Author: * Christophe Dumez Contributors: -* Arnaud Demaizière +* Stefanos Antaris * Ishan Arora +* Arnaud Demaizière * Grigis Gaëtan -* Stefanos Antaris Code from other projects: * files src/ico.cpp src/ico.h diff --git a/Changelog b/Changelog index 948369cf1..fb40bb483 100644 --- a/Changelog +++ b/Changelog @@ -11,6 +11,9 @@ - FEATURE: Tracker connections are now also subject to IP filtering - FEATURE: Include DHT traffic in the rate limiter - FEATURE: Support for bitcomet padding files + - FEATURE: Option to skip file checking and start seeding immediately in torrent addition dialog (Stephanos Antaris) + - FEATURE: Dropped dependency on libcurl + - FEATURE: Dropped Qt 4.3 support (Qt >= 4.4 is required) * Thu Sep 3 2009 - Christophe Dumez - v1.5.0 - FEATURE: Added Magnet URI support diff --git a/INSTALL b/INSTALL index ae8cb5f3a..44a899a20 100644 --- a/INSTALL +++ b/INSTALL @@ -1,12 +1,6 @@ qBittorrent - A BitTorrent client in C++ / Qt4 ------------------------------------------ -*** Necessary if qt3 is default on your system *** -export QTDIR=/usr/include/qt4 -export PATH=$QTDIR/bin:$PATH -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib -*** End *** - ./configure make && make install qbittorrent @@ -14,8 +8,7 @@ qbittorrent will install and execute qBittorrent hopefully without any problems. Dependencies: -- Qt >= 4.3.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml) - Qt >= 4.4.0 is advised +- Qt >= 4.4.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml) - libtorrent-rasterbar by Arvid Norberg (>= v0.15.0 REQUIRED) -> http://www.qbittorrent.org/download.php (advised) @@ -24,13 +17,8 @@ Dependencies: - libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization -- libcurl - - python >= 2.3 (needed by search engine) -- libmagick++ (advised, not required) - * Needed for favicons support (RSS / Search plugins) - - libzzip (advised, not required) * Needed for zip support (Search plugins) diff --git a/configure b/configure index 2c0a35784..af45cc823 100755 --- a/configure +++ b/configure @@ -19,8 +19,6 @@ Main options: Dependency options: --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 @@ -145,16 +143,6 @@ while [ $# -gt 0 ]; do shift ;; - --with-libcurl-inc=*) - QC_WITH_LIBCURL_INC=$optarg - shift - ;; - - --with-libcurl-lib=*) - QC_WITH_LIBCURL_LIB=$optarg - shift - ;; - --disable-libzzip) QC_DISABLE_libzzip="Y" shift @@ -192,8 +180,6 @@ echo BINDIR=$BINDIR echo DATADIR=$DATADIR echo EX_QTDIR=$EX_QTDIR echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC -echo QC_WITH_LIBCURL_INC=$QC_WITH_LIBCURL_INC -echo QC_WITH_LIBCURL_LIB=$QC_WITH_LIBCURL_LIB echo QC_DISABLE_libzzip=$QC_DISABLE_libzzip echo QC_WITH_LIBZZIP_INC=$QC_WITH_LIBZZIP_INC echo QC_WITH_LIBZZIP_LIB=$QC_WITH_LIBZZIP_LIB @@ -308,14 +294,11 @@ class qc_qt4 : public ConfObj { public: qc_qt4(Conf *c) : ConfObj(c) {} - QString name() const { return "Qt >= 4.3"; } - QString shortname() const { return "Qt 4.3"; } + QString name() const { return "Qt >= 4.4"; } + QString shortname() const { return "Qt 4.4"; } bool exec() { - if(QT_VERSION >= 0x040400) { - conf->addDefine("QT_4_4"); - } - return(QT_VERSION >= 0x040300); + return(QT_VERSION >= 0x040400); } }; @@ -403,68 +386,6 @@ public: return true; } }; -#line 1 "libcurl.qcm" -/* ------BEGIN QCMOD----- -name: libcommoncpp2 -arg: with-libcurl-inc=[path], Path to libcurl include files -arg: with-libcurl-lib=[path], Path to libcurl library files ------END QCMOD----- -*/ -class qc_libcurl : public ConfObj -{ -public: - qc_libcurl(Conf *c) : ConfObj(c) {} - QString name() const { return "libcurl"; } - QString shortname() const { return "libcurl"; } - bool exec(){ - QString s; - s = conf->getenv("QC_WITH_LIBCURL_INC"); - if(!s.isEmpty()) { - if(!conf->checkHeader(s, "curl/curl.h")) { - return false; - } - }else{ - QStringList sl; - sl << "/usr/include"; - sl << "/usr/local/include"; - bool found = false; - foreach(s, sl){ - if(conf->checkHeader(s, "curl/curl.h")){ - found = true; - break; - } - } - if(!found) { - return false; - } - } - conf->addIncludePath(s); - - s = conf->getenv("QC_WITH_LIBCURL_LIB"); - if(!s.isEmpty()) { - if(!QFile::exists(s+QString("/libcurl.so"))) - return false; - conf->addLib(QString("-L") + s); - }else{ - QStringList sl; - sl << "/usr/lib/"; - sl << "/usr/lib64/"; - sl << "/usr/local/lib/"; - sl << "/usr/local/lib64/"; - bool found = false; - foreach(s, sl){ - if(QFile::exists(s+QString("libcurl.so"))){ - found = true; - break; - } - } - if(!found) return false; - conf->addLib(QString("-L") + s); - } - return true; - } -}; #line 1 "libzzip.qcm" /* -----BEGIN QCMOD----- @@ -549,9 +470,6 @@ cat >$1/modules_new.cpp <required = true; o->disabled = false; - o = new qc_libcurl(conf); - o->required = true; - o->disabled = false; o = new qc_libzzip(conf); o->required = false; o->disabled = false; @@ -1501,8 +1419,6 @@ export BINDIR export DATADIR export EX_QTDIR export QC_WITH_LIBBOOST_INC -export QC_WITH_LIBCURL_INC -export QC_WITH_LIBCURL_LIB export QC_DISABLE_libzzip export QC_WITH_LIBZZIP_INC export QC_WITH_LIBZZIP_LIB diff --git a/doc/qbittorrent.1 b/doc/qbittorrent.1 index e5e50af77..571b258a8 100644 --- a/doc/qbittorrent.1 +++ b/doc/qbittorrent.1 @@ -8,7 +8,7 @@ qBittorrent \- a Bittorrent client written in C++ / Qt4 .SH "SYNOPSIS" -\fBqbittorrent\fR [--no-splash] [TORRENT_FILE | URL]... +\fBqbittorrent\fR [\-\-no-splash] [TORRENT_FILE | URL]... \fBqbittorrent\fR \-\-help diff --git a/qbittorrent.qc b/qbittorrent.qc index ffb74fe12..d1828ef8a 100644 --- a/qbittorrent.qc +++ b/qbittorrent.qc @@ -12,8 +12,5 @@ - - - diff --git a/qcm/libcurl.qcm b/qcm/libcurl.qcm deleted file mode 100644 index b3af39b4a..000000000 --- a/qcm/libcurl.qcm +++ /dev/null @@ -1,61 +0,0 @@ -/* ------BEGIN QCMOD----- -name: libcommoncpp2 -arg: with-libcurl-inc=[path], Path to libcurl include files -arg: with-libcurl-lib=[path], Path to libcurl library files ------END QCMOD----- -*/ -class qc_libcurl : public ConfObj -{ -public: - qc_libcurl(Conf *c) : ConfObj(c) {} - QString name() const { return "libcurl"; } - QString shortname() const { return "libcurl"; } - bool exec(){ - QString s; - s = conf->getenv("QC_WITH_LIBCURL_INC"); - if(!s.isEmpty()) { - if(!conf->checkHeader(s, "curl/curl.h")) { - return false; - } - }else{ - QStringList sl; - sl << "/usr/include"; - sl << "/usr/local/include"; - bool found = false; - foreach(s, sl){ - if(conf->checkHeader(s, "curl/curl.h")){ - found = true; - break; - } - } - if(!found) { - return false; - } - } - conf->addIncludePath(s); - - s = conf->getenv("QC_WITH_LIBCURL_LIB"); - if(!s.isEmpty()) { - if(!QFile::exists(s+QString("/libcurl.so"))) - return false; - conf->addLib(QString("-L") + s); - }else{ - QStringList sl; - sl << "/usr/lib/"; - sl << "/usr/lib64/"; - sl << "/usr/local/lib/"; - sl << "/usr/local/lib64/"; - bool found = false; - foreach(s, sl){ - if(QFile::exists(s+QString("libcurl.so"))){ - found = true; - break; - } - } - if(!found) return false; - conf->addLib(QString("-L") + s); - } - return true; - } -}; diff --git a/qcm/qt4.qcm b/qcm/qt4.qcm index 00c709812..947e36a93 100644 --- a/qcm/qt4.qcm +++ b/qcm/qt4.qcm @@ -7,14 +7,11 @@ class qc_qt4 : public ConfObj { public: qc_qt4(Conf *c) : ConfObj(c) {} - QString name() const { return "Qt >= 4.3"; } - QString shortname() const { return "Qt 4.3"; } + QString name() const { return "Qt >= 4.4"; } + QString shortname() const { return "Qt 4.4"; } bool exec() { - if(QT_VERSION >= 0x040400) { - conf->addDefine("QT_4_4"); - } - return(QT_VERSION >= 0x040300); + return(QT_VERSION >= 0x040400); } }; diff --git a/src/GUI.cpp b/src/GUI.cpp index d48a7d20a..62f98af5c 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -35,15 +35,10 @@ #include #include #include -#ifdef QT_4_4 #include #include #include #include -#else -#include -#include -#endif #include #include #include @@ -189,7 +184,6 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis initWebUi(username, password, port); } // Use a tcp server to allow only one instance of qBittorrent -#ifdef QT_4_4 localServer = new QLocalServer(); QString uid = QString::number(getuid()); #ifdef Q_WS_X11 @@ -200,1471 +194,1461 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis } #endif if (!localServer->listen("qBittorrent-"+uid)) { -#else - localServer = new QTcpServer(); - if (!localServer->listen(QHostAddress::LocalHost)) { -#endif - std::cerr << "Couldn't create socket, single instance mode won't work...\n"; - } -#ifndef QT_4_4 - else { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - settings.setValue(QString::fromUtf8("uniqueInstancePort"), localServer->serverPort()); - } -#endif - connect(localServer, SIGNAL(newConnection()), this, SLOT(acceptConnection())); - // Start connection checking timer - checkConnect = new QTimer(this); - connect(checkConnect, SIGNAL(timeout()), this, SLOT(checkConnectionStatus())); - checkConnect->start(5000); - // Accept drag 'n drops - setAcceptDrops(true); - createKeyboardShortcuts(); - connecStatusLblIcon = new QLabel(); - connecStatusLblIcon->setFrameShape(QFrame::NoFrame); - connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png"))); - connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection status:")+QString::fromUtf8("
")+QString::fromUtf8("")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("")); - dlSpeedLbl = new QLabel(tr("DL: %1 KiB/s").arg("0.0")); - upSpeedLbl = new QLabel(tr("UP: %1 KiB/s").arg("0.0")); - ratioLbl = new QLabel(tr("Ratio: %1").arg("1.0")); - DHTLbl = new QLabel(tr("DHT: %1 nodes").arg(0)); - statusSep1 = new QFrame(); - statusSep1->setFixedWidth(1); - statusSep1->setFrameStyle(QFrame::Box); - statusSep2 = new QFrame(); - statusSep2->setFixedWidth(1); - statusSep2->setFrameStyle(QFrame::Box); - statusSep3 = new QFrame(); - statusSep3->setFixedWidth(1); - statusSep3->setFrameStyle(QFrame::Box); - statusSep4 = new QFrame(); - statusSep4->setFixedWidth(1); - statusSep4->setFrameStyle(QFrame::Box); - QMainWindow::statusBar()->addPermanentWidget(DHTLbl); - QMainWindow::statusBar()->addPermanentWidget(statusSep1); - QMainWindow::statusBar()->addPermanentWidget(connecStatusLblIcon); - QMainWindow::statusBar()->addPermanentWidget(statusSep2); - QMainWindow::statusBar()->addPermanentWidget(dlSpeedLbl); - QMainWindow::statusBar()->addPermanentWidget(statusSep3); - QMainWindow::statusBar()->addPermanentWidget(upSpeedLbl); - QMainWindow::statusBar()->addPermanentWidget(statusSep4); - QMainWindow::statusBar()->addPermanentWidget(ratioLbl); - show(); - if(settings.value(QString::fromUtf8("Preferences/General/StartMinimized"), false).toBool()) { - this->setWindowState(Qt::WindowMinimized); - } - scrapeTimer = new QTimer(this); - connect(scrapeTimer, SIGNAL(timeout()), this, SLOT(scrapeTrackers())); - scrapeTimer->start(20000); - qDebug("GUI Built"); - } - - // Destructor - GUI::~GUI() { - qDebug("GUI destruction"); - hide(); - // Do this as soon as possible - BTSession->saveDHTEntry(); - BTSession->saveSessionState(); - BTSession->saveFastResumeData(); - scrapeTimer->stop(); - delete scrapeTimer; - delete dlSpeedLbl; - delete upSpeedLbl; - delete ratioLbl; - delete DHTLbl; - delete statusSep1; - delete statusSep2; - delete statusSep3; - delete statusSep4; - if(rssWidget != 0) + std::cerr << "Couldn't create socket, single instance mode won't work...\n"; + } + connect(localServer, SIGNAL(newConnection()), this, SLOT(acceptConnection())); + // Start connection checking timer + checkConnect = new QTimer(this); + connect(checkConnect, SIGNAL(timeout()), this, SLOT(checkConnectionStatus())); + checkConnect->start(5000); + // Accept drag 'n drops + setAcceptDrops(true); + createKeyboardShortcuts(); + connecStatusLblIcon = new QLabel(); + connecStatusLblIcon->setFrameShape(QFrame::NoFrame); + connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png"))); + connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection status:")+QString::fromUtf8("
")+QString::fromUtf8("")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("")); + dlSpeedLbl = new QLabel(tr("DL: %1 KiB/s").arg("0.0")); + upSpeedLbl = new QLabel(tr("UP: %1 KiB/s").arg("0.0")); + ratioLbl = new QLabel(tr("Ratio: %1").arg("1.0")); + DHTLbl = new QLabel(tr("DHT: %1 nodes").arg(0)); + statusSep1 = new QFrame(); + statusSep1->setFixedWidth(1); + statusSep1->setFrameStyle(QFrame::Box); + statusSep2 = new QFrame(); + statusSep2->setFixedWidth(1); + statusSep2->setFrameStyle(QFrame::Box); + statusSep3 = new QFrame(); + statusSep3->setFixedWidth(1); + statusSep3->setFrameStyle(QFrame::Box); + statusSep4 = new QFrame(); + statusSep4->setFixedWidth(1); + statusSep4->setFrameStyle(QFrame::Box); + QMainWindow::statusBar()->addPermanentWidget(DHTLbl); + QMainWindow::statusBar()->addPermanentWidget(statusSep1); + QMainWindow::statusBar()->addPermanentWidget(connecStatusLblIcon); + QMainWindow::statusBar()->addPermanentWidget(statusSep2); + QMainWindow::statusBar()->addPermanentWidget(dlSpeedLbl); + QMainWindow::statusBar()->addPermanentWidget(statusSep3); + QMainWindow::statusBar()->addPermanentWidget(upSpeedLbl); + QMainWindow::statusBar()->addPermanentWidget(statusSep4); + QMainWindow::statusBar()->addPermanentWidget(ratioLbl); + show(); + if(settings.value(QString::fromUtf8("Preferences/General/StartMinimized"), false).toBool()) { + this->setWindowState(Qt::WindowMinimized); + } + scrapeTimer = new QTimer(this); + connect(scrapeTimer, SIGNAL(timeout()), this, SLOT(scrapeTrackers())); + scrapeTimer->start(20000); + qDebug("GUI Built"); +} + +// Destructor +GUI::~GUI() { + qDebug("GUI destruction"); + hide(); + // Do this as soon as possible + BTSession->saveDHTEntry(); + BTSession->saveSessionState(); + BTSession->saveFastResumeData(); + scrapeTimer->stop(); + delete scrapeTimer; + delete dlSpeedLbl; + delete upSpeedLbl; + delete ratioLbl; + delete DHTLbl; + delete statusSep1; + delete statusSep2; + delete statusSep3; + delete statusSep4; + if(rssWidget != 0) + delete rssWidget; + delete searchEngine; + delete refresher; + delete downloadingTorrentTab; + delete finishedTorrentTab; + delete checkConnect; + qDebug("1"); + if(systrayCreator) { + delete systrayCreator; + } + if(systrayIntegration) { + delete myTrayIcon; + delete myTrayIconMenu; + } + qDebug("2"); + localServer->close(); + delete localServer; + delete connecStatusLblIcon; + delete tabs; + // HTTP Server + if(httpServer) + delete httpServer; + qDebug("3"); + // Keyboard shortcuts + delete switchSearchShortcut; + delete switchSearchShortcut2; + delete switchDownShortcut; + delete switchUpShortcut; + delete switchRSSShortcut; + qDebug("4"); + delete BTSession; + qDebug("5"); +} + +void GUI::displayRSSTab(bool enable) { + if(enable) { + // RSS tab + if(rssWidget == 0) { + rssWidget = new RSSImp(BTSession); + tabs->addTab(rssWidget, tr("RSS")); + tabs->setTabIcon(3, QIcon(QString::fromUtf8(":/Icons/rss32.png"))); + } + } else { + if(rssWidget != 0) { delete rssWidget; - delete searchEngine; - delete refresher; - delete downloadingTorrentTab; - delete finishedTorrentTab; - delete checkConnect; - qDebug("1"); - if(systrayCreator) { - delete systrayCreator; - } - if(systrayIntegration) { - delete myTrayIcon; - delete myTrayIconMenu; - } - qDebug("2"); - localServer->close(); - delete localServer; - delete connecStatusLblIcon; - delete tabs; - // HTTP Server - if(httpServer) - delete httpServer; - qDebug("3"); - // Keyboard shortcuts - delete switchSearchShortcut; - delete switchSearchShortcut2; - delete switchDownShortcut; - delete switchUpShortcut; - delete switchRSSShortcut; - qDebug("4"); - delete BTSession; - qDebug("5"); - } - - void GUI::displayRSSTab(bool enable) { - if(enable) { - // RSS tab - if(rssWidget == 0) { - rssWidget = new RSSImp(BTSession); - tabs->addTab(rssWidget, tr("RSS")); - tabs->setTabIcon(3, QIcon(QString::fromUtf8(":/Icons/rss32.png"))); - } - } else { - if(rssWidget != 0) { - delete rssWidget; - rssWidget = 0; - } + rssWidget = 0; } } - - void GUI::scrapeTrackers() { - std::vector torrents = BTSession->getTorrents(); - std::vector::iterator torrentIT; - for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { - QTorrentHandle h = QTorrentHandle(*torrentIT); - if(!h.is_valid()) continue; - h.scrape_tracker(); - } +} + +void GUI::scrapeTrackers() { + std::vector torrents = BTSession->getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid()) continue; + h.scrape_tracker(); + } +} + +void GUI::updateRatio() { + // Update ratio info + float ratio = 1.; + session_status sessionStatus = BTSession->getSessionStatus(); + if(sessionStatus.total_payload_download == 0) { + if(sessionStatus.total_payload_upload == 0) + ratio = 1.; + else + ratio = 10.; + }else{ + ratio = (double)sessionStatus.total_payload_upload / (double)sessionStatus.total_payload_download; + if(ratio > 10.) + ratio = 10.; + } + ratioLbl->setText(tr("Ratio: %1").arg(QString(QByteArray::number(ratio, 'f', 1)))); + // Update DHT nodes + DHTLbl->setText(tr("DHT: %1 nodes").arg(QString::number(sessionStatus.dht_nodes))); +} + +void GUI::on_actionWebsite_triggered() const { + QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://www.qbittorrent.org"))); +} + +void GUI::on_actionDocumentation_triggered() const { + QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://wiki.qbittorrent.org"))); +} + +void GUI::on_actionBugReport_triggered() const { + QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://bugs.qbittorrent.org"))); +} + +void GUI::writeSettings() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.beginGroup(QString::fromUtf8("MainWindow")); + settings.setValue(QString::fromUtf8("size"), size()); + settings.setValue(QString::fromUtf8("pos"), pos()); + settings.endGroup(); +} + +// called when a torrent has finished +void GUI::finishedTorrent(QTorrentHandle& h) const { + qDebug("In GUI, a torrent has finished"); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool show_msg = true; + if(TorrentPersistentData::isSeed(h.hash())) + show_msg = false; + QString fileName = h.name(); + bool useNotificationBalloons = settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool(); + // Add it to finished tab + QString hash = h.hash(); + if(show_msg) + BTSession->addConsoleMessage(tr("%1 has finished downloading.", "e.g: xxx.avi has finished downloading.").arg(fileName)); + downloadingTorrentTab->deleteTorrent(hash); + finishedTorrentTab->addTorrent(hash); + if(show_msg && systrayIntegration && useNotificationBalloons) { + myTrayIcon->showMessage(tr("Download finished"), tr("%1 has finished downloading.", "e.g: xxx.avi has finished downloading.").arg(fileName), QSystemTrayIcon::Information, TIME_TRAY_BALLOON); + } +} + +void GUI::addedTorrent(QTorrentHandle& h) const { + if(h.is_seed()) { + finishedTorrentTab->addTorrent(h.hash()); + } else { + downloadingTorrentTab->addTorrent(h.hash()); } - - void GUI::updateRatio() { - // Update ratio info - float ratio = 1.; - session_status sessionStatus = BTSession->getSessionStatus(); - if(sessionStatus.total_payload_download == 0) { - if(sessionStatus.total_payload_upload == 0) - ratio = 1.; - else - ratio = 10.; - }else{ - ratio = (double)sessionStatus.total_payload_upload / (double)sessionStatus.total_payload_download; - if(ratio > 10.) - ratio = 10.; - } - ratioLbl->setText(tr("Ratio: %1").arg(QString(QByteArray::number(ratio, 'f', 1)))); - // Update DHT nodes - DHTLbl->setText(tr("DHT: %1 nodes").arg(QString::number(sessionStatus.dht_nodes))); - } - - void GUI::on_actionWebsite_triggered() const { - QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://www.qbittorrent.org"))); - } - - void GUI::on_actionDocumentation_triggered() const { - QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://wiki.qbittorrent.org"))); - } - - void GUI::on_actionBugReport_triggered() const { - QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://bugs.qbittorrent.org"))); - } - - void GUI::writeSettings() { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - settings.beginGroup(QString::fromUtf8("MainWindow")); - settings.setValue(QString::fromUtf8("size"), size()); - settings.setValue(QString::fromUtf8("pos"), pos()); - settings.endGroup(); - } - - // called when a torrent has finished - void GUI::finishedTorrent(QTorrentHandle& h) const { - qDebug("In GUI, a torrent has finished"); - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - bool show_msg = true; - if(TorrentPersistentData::isSeed(h.hash())) - show_msg = false; - QString fileName = h.name(); - bool useNotificationBalloons = settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool(); - // Add it to finished tab - QString hash = h.hash(); - if(show_msg) - BTSession->addConsoleMessage(tr("%1 has finished downloading.", "e.g: xxx.avi has finished downloading.").arg(fileName)); - downloadingTorrentTab->deleteTorrent(hash); - finishedTorrentTab->addTorrent(hash); - if(show_msg && systrayIntegration && useNotificationBalloons) { - myTrayIcon->showMessage(tr("Download finished"), tr("%1 has finished downloading.", "e.g: xxx.avi has finished downloading.").arg(fileName), QSystemTrayIcon::Information, TIME_TRAY_BALLOON); - } +} + +void GUI::pausedTorrent(QTorrentHandle& h) const { + if(h.is_seed()) { + finishedTorrentTab->pauseTorrent(h.hash()); + } else { + downloadingTorrentTab->pauseTorrent(h.hash()); } - - void GUI::addedTorrent(QTorrentHandle& h) const { - if(h.is_seed()) { - finishedTorrentTab->addTorrent(h.hash()); - } else { +} + +void GUI::resumedTorrent(QTorrentHandle& h) const { + if(h.is_seed()) { + finishedTorrentTab->updateTorrent(h); + } else { + downloadingTorrentTab->updateTorrent(h); + } +} + +void GUI::checkedTorrent(QTorrentHandle& h) const { + if(h.is_seed()) { + // Move torrent to finished tab + downloadingTorrentTab->deleteTorrent(h.hash()); + finishedTorrentTab->addTorrent(h.hash()); + } else { + // Move torrent back to download list (if necessary) + if(TorrentPersistentData::isSeed(h.hash())) { + TorrentPersistentData::saveSeedStatus(h); + finishedTorrentTab->deleteTorrent(h.hash()); downloadingTorrentTab->addTorrent(h.hash()); } } - - void GUI::pausedTorrent(QTorrentHandle& h) const { - if(h.is_seed()) { - finishedTorrentTab->pauseTorrent(h.hash()); - } else { - downloadingTorrentTab->pauseTorrent(h.hash()); - } +} + +// Notification when disk is full +void GUI::fullDiskError(QTorrentHandle& h, QString msg) const { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool useNotificationBalloons = settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool(); + if(systrayIntegration && useNotificationBalloons) { + myTrayIcon->showMessage(tr("I/O Error", "i.e: Input/Output Error"), tr("An I/O error occured for torrent %1.\n Reason: %2", "e.g: An error occured for torrent xxx.avi.\n Reason: disk is full.").arg(h.name()).arg(msg), QSystemTrayIcon::Critical, TIME_TRAY_BALLOON); + } + // Download will be paused by libtorrent. Updating GUI information accordingly + QString hash = h.hash(); + qDebug("Full disk error, pausing torrent %s", hash.toLocal8Bit().data()); + setPaused(h); + BTSession->addConsoleMessage(tr("An error occured (full disk?), '%1' paused.", "e.g: An error occured (full disk?), 'xxx.avi' paused.").arg(h.name())); +} + +void GUI::setPaused(QTorrentHandle &h) const { + if(!h.is_paused()) { + // FIXME in v1.6.0: Add Error state and stop using pause for this + h.pause(); + } + qDebug("Marking torrent %s as paused", h.hash().toLocal8Bit().data()); + if(h.is_seed()) { + // In finished list + qDebug("Automatically paused torrent was in finished list"); + finishedTorrentTab->pauseTorrent(h.hash()); + }else{ + downloadingTorrentTab->pauseTorrent(h.hash()); } - - void GUI::resumedTorrent(QTorrentHandle& h) const { - if(h.is_seed()) { - finishedTorrentTab->updateTorrent(h); - } else { - downloadingTorrentTab->updateTorrent(h); +} + +void GUI::createKeyboardShortcuts() { + actionCreate_torrent->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+N"))); + actionOpen->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+O"))); + actionExit->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Q"))); + switchDownShortcut = new QShortcut(QKeySequence(tr("Alt+1", "shortcut to switch to first tab")), this); + connect(switchDownShortcut, SIGNAL(activated()), this, SLOT(displayDownTab())); + switchUpShortcut = new QShortcut(QKeySequence(tr("Alt+2", "shortcut to switch to second tab")), this); + connect(switchUpShortcut, SIGNAL(activated()), this, SLOT(displayUpTab())); + switchSearchShortcut = new QShortcut(QKeySequence(tr("Alt+3", "shortcut to switch to third tab")), this); + connect(switchSearchShortcut, SIGNAL(activated()), this, SLOT(displaySearchTab())); + switchSearchShortcut2 = new QShortcut(QKeySequence(tr("Ctrl+F", "shortcut to switch to search tab")), this); + connect(switchSearchShortcut2, SIGNAL(activated()), this, SLOT(displaySearchTab())); + switchRSSShortcut = new QShortcut(QKeySequence(tr("Alt+4", "shortcut to switch to fourth tab")), this); + connect(switchRSSShortcut, SIGNAL(activated()), this, SLOT(displayRSSTab())); + actionTorrent_Properties->setShortcut(QKeySequence(QString::fromUtf8("Alt+P"))); + actionOptions->setShortcut(QKeySequence(QString::fromUtf8("Alt+O"))); + actionDelete->setShortcut(QKeySequence(QString::fromUtf8("Del"))); + actionDelete_Permanently->setShortcut(QKeySequence(QString::fromUtf8("Shift+Del"))); + actionStart->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+S"))); + actionStart_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+S"))); + actionPause->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+P"))); + actionPause_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+P"))); + actionDecreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+-"))); + actionIncreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl++"))); +} + +// Keyboard shortcuts slots +void GUI::displayDownTab() const { + tabs->setCurrentIndex(0); +} + +void GUI::displayUpTab() const { + tabs->setCurrentIndex(1); +} + +void GUI::displaySearchTab() const { + tabs->setCurrentIndex(2); +} + +void GUI::displayRSSTab() const { + tabs->setCurrentIndex(3); +} + +// End of keyboard shortcuts slots + +void GUI::readSettings() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.beginGroup(QString::fromUtf8("MainWindow")); + resize(settings.value(QString::fromUtf8("size"), size()).toSize()); + move(settings.value(QString::fromUtf8("pos"), screenCenter()).toPoint()); + settings.endGroup(); +} + +void GUI::balloonClicked() { + if(isHidden()) { + show(); + if(isMinimized()) { + showNormal(); } + raise(); + activateWindow(); } - - void GUI::checkedTorrent(QTorrentHandle& h) const { - if(h.is_seed()) { - // Move torrent to finished tab - downloadingTorrentTab->deleteTorrent(h.hash()); - finishedTorrentTab->addTorrent(h.hash()); - } else { - // Move torrent back to download list (if necessary) - if(TorrentPersistentData::isSeed(h.hash())) { - TorrentPersistentData::saveSeedStatus(h); - finishedTorrentTab->deleteTorrent(h.hash()); - downloadingTorrentTab->addTorrent(h.hash()); - } +} + +void GUI::acceptConnection() { + clientConnection = localServer->nextPendingConnection(); + connect(clientConnection, SIGNAL(disconnected()), this, SLOT(readParamsOnSocket())); + qDebug("accepted connection from another instance"); +} + +void GUI::readParamsOnSocket() { + if(clientConnection) { + QByteArray params = clientConnection->readAll(); + if(!params.isEmpty()) { + processParams(QString::fromUtf8(params.data()).split(QString::fromUtf8("\n"))); + qDebug("Received parameters from another instance"); } } - - // Notification when disk is full - void GUI::fullDiskError(QTorrentHandle& h, QString msg) const { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - bool useNotificationBalloons = settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool(); - if(systrayIntegration && useNotificationBalloons) { - myTrayIcon->showMessage(tr("I/O Error", "i.e: Input/Output Error"), tr("An I/O error occured for torrent %1.\n Reason: %2", "e.g: An error occured for torrent xxx.avi.\n Reason: disk is full.").arg(h.name()).arg(msg), QSystemTrayIcon::Critical, TIME_TRAY_BALLOON); - } - // Download will be paused by libtorrent. Updating GUI information accordingly - QString hash = h.hash(); - qDebug("Full disk error, pausing torrent %s", hash.toLocal8Bit().data()); - setPaused(h); - BTSession->addConsoleMessage(tr("An error occured (full disk?), '%1' paused.", "e.g: An error occured (full disk?), 'xxx.avi' paused.").arg(h.name())); - } - - void GUI::setPaused(QTorrentHandle &h) const { - if(!h.is_paused()) { - // FIXME in v1.6.0: Add Error state and stop using pause for this - h.pause(); +} + +void GUI::handleDownloadFromUrlFailure(QString url, QString reason) const{ + // Display a message box + QMessageBox::critical(0, tr("Url download error"), tr("Couldn't download file at url: %1, reason: %2.").arg(url).arg(reason)); +} + +void GUI::on_actionSet_global_upload_limit_triggered() { + qDebug("actionSet_global_upload_limit_triggered"); + new BandwidthAllocationDialog(this, true, BTSession, QStringList()); +} + +void GUI::on_actionShow_console_triggered() { + new consoleDlg(this, BTSession); +} + +void GUI::on_actionSet_global_download_limit_triggered() { + qDebug("actionSet_global_download_limit_triggered"); + new BandwidthAllocationDialog(this, false, BTSession, QStringList()); +} + +void GUI::on_actionPreview_file_triggered() { + QString hash; + switch(tabs->currentIndex()){ + case 0: + hash = downloadingTorrentTab->getSelectedTorrents(true).first(); + break; + case 1: + hash = finishedTorrentTab->getSelectedTorrents(true).first(); + break; + default: + return; + } + QTorrentHandle h = BTSession->getTorrentHandle(hash); + new previewSelect(this, h); +} + +void GUI::openDestinationFolder() const { + QStringList hashes; + switch(tabs->currentIndex()){ + case 0: + hashes = downloadingTorrentTab->getSelectedTorrents(true); + break; + case 1: + hashes = finishedTorrentTab->getSelectedTorrents(true); + break; + default: + return; + } + QStringList pathsList; + foreach(const QString &hash, hashes) { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + QString savePath = h.save_path(); + if(!pathsList.contains(savePath)) { + pathsList.append(savePath); + QDesktopServices::openUrl(QString("file://")+savePath); } - qDebug("Marking torrent %s as paused", h.hash().toLocal8Bit().data()); - if(h.is_seed()) { - // In finished list - qDebug("Automatically paused torrent was in finished list"); - finishedTorrentTab->pauseTorrent(h.hash()); - }else{ - downloadingTorrentTab->pauseTorrent(h.hash()); + } +} + +void GUI::copyMagnetURI() const { + QStringList hashes; + switch(tabs->currentIndex()){ + case 0: + hashes = downloadingTorrentTab->getSelectedTorrents(); + break; + case 1: + hashes = finishedTorrentTab->getSelectedTorrents(); + break; + default: + return; + } + QStringList magnet_uris; + foreach(QString hash, hashes) { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(h.is_valid()) { + magnet_uris << misc::toQString(make_magnet_uri(h.get_torrent_info())); } } - - void GUI::createKeyboardShortcuts() { - actionCreate_torrent->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+N"))); - actionOpen->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+O"))); - actionExit->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Q"))); - switchDownShortcut = new QShortcut(QKeySequence(tr("Alt+1", "shortcut to switch to first tab")), this); - connect(switchDownShortcut, SIGNAL(activated()), this, SLOT(displayDownTab())); - switchUpShortcut = new QShortcut(QKeySequence(tr("Alt+2", "shortcut to switch to second tab")), this); - connect(switchUpShortcut, SIGNAL(activated()), this, SLOT(displayUpTab())); - switchSearchShortcut = new QShortcut(QKeySequence(tr("Alt+3", "shortcut to switch to third tab")), this); - connect(switchSearchShortcut, SIGNAL(activated()), this, SLOT(displaySearchTab())); - switchSearchShortcut2 = new QShortcut(QKeySequence(tr("Ctrl+F", "shortcut to switch to search tab")), this); - connect(switchSearchShortcut2, SIGNAL(activated()), this, SLOT(displaySearchTab())); - switchRSSShortcut = new QShortcut(QKeySequence(tr("Alt+4", "shortcut to switch to fourth tab")), this); - connect(switchRSSShortcut, SIGNAL(activated()), this, SLOT(displayRSSTab())); - actionTorrent_Properties->setShortcut(QKeySequence(QString::fromUtf8("Alt+P"))); - actionOptions->setShortcut(QKeySequence(QString::fromUtf8("Alt+O"))); - actionDelete->setShortcut(QKeySequence(QString::fromUtf8("Del"))); - actionDelete_Permanently->setShortcut(QKeySequence(QString::fromUtf8("Shift+Del"))); - actionStart->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+S"))); - actionStart_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+S"))); - actionPause->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+P"))); - actionPause_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+P"))); - actionDecreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+-"))); - actionIncreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl++"))); - } - - // Keyboard shortcuts slots - void GUI::displayDownTab() const { - tabs->setCurrentIndex(0); - } - - void GUI::displayUpTab() const { - tabs->setCurrentIndex(1); - } - - void GUI::displaySearchTab() const { - tabs->setCurrentIndex(2); - } - - void GUI::displayRSSTab() const { - tabs->setCurrentIndex(3); - } - - // End of keyboard shortcuts slots - - void GUI::readSettings() { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - settings.beginGroup(QString::fromUtf8("MainWindow")); - resize(settings.value(QString::fromUtf8("size"), size()).toSize()); - move(settings.value(QString::fromUtf8("pos"), screenCenter()).toPoint()); - settings.endGroup(); - } - - void GUI::balloonClicked() { + qApp->clipboard()->setText(magnet_uris.join("\n")); +} + +void GUI::goBuyPage() const { + QStringList hashes; + switch(tabs->currentIndex()){ + case 0: + hashes = downloadingTorrentTab->getSelectedTorrents(true); + break; + case 1: + hashes = finishedTorrentTab->getSelectedTorrents(true); + break; + default: + return; + } + QStringList pathsList; + foreach(const QString &hash, hashes) { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + QDesktopServices::openUrl("http://match.sharemonkey.com/?info_hash="+hash+"&n="+h.name()+"&cid=33"); + } +} + +// Necessary if we want to close the window +// in one time if "close to systray" is enabled +void GUI::on_actionExit_triggered() { + force_exit = true; + close(); +} + +void GUI::previewFile(QString filePath) { + QDesktopServices::openUrl(QString("file://")+filePath); +} + +int GUI::getCurrentTabIndex() const{ + if(isMinimized() || isHidden()) + return -1; + return tabs->currentIndex(); +} + +void GUI::setTabText(int index, QString text) const { + tabs->setTabText(index, text); +} + +// Toggle Main window visibility +void GUI::toggleVisibility(QSystemTrayIcon::ActivationReason e) { + if(e == QSystemTrayIcon::Trigger || e == QSystemTrayIcon::DoubleClick) { if(isHidden()) { show(); if(isMinimized()) { - showNormal(); + if(isMaximized()) { + showMaximized(); + }else{ + showNormal(); + } } raise(); activateWindow(); + }else{ + hide(); } } - - void GUI::acceptConnection() { - clientConnection = localServer->nextPendingConnection(); - connect(clientConnection, SIGNAL(disconnected()), this, SLOT(readParamsOnSocket())); - qDebug("accepted connection from another instance"); - } - - void GUI::readParamsOnSocket() { - if(clientConnection) { - QByteArray params = clientConnection->readAll(); - if(!params.isEmpty()) { - processParams(QString::fromUtf8(params.data()).split(QString::fromUtf8("\n"))); - qDebug("Received parameters from another instance"); - } - } +} + +// Center window +QPoint GUI::screenCenter() const{ + int scrn = 0; + QWidget *w = this->topLevelWidget(); + + if(w) + scrn = QApplication::desktop()->screenNumber(w); + else if(QApplication::desktop()->isVirtualDesktop()) + scrn = QApplication::desktop()->screenNumber(QCursor::pos()); + else + scrn = QApplication::desktop()->screenNumber(this); + + QRect desk(QApplication::desktop()->availableGeometry(scrn)); + return QPoint((desk.width() - this->frameGeometry().width()) / 2, (desk.height() - this->frameGeometry().height()) / 2); +} + +// Display About Dialog +void GUI::on_actionAbout_triggered() { + //About dialog + new about(this); +} + +void GUI::showEvent(QShowEvent *e) { + qDebug("** Show Event **"); + updateLists(true); + e->accept(); +} + +// Called when we close the program +void GUI::closeEvent(QCloseEvent *e) { + + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool goToSystrayOnExit = settings.value(QString::fromUtf8("Preferences/General/CloseToTray"), false).toBool(); + if(!force_exit && systrayIntegration && goToSystrayOnExit && !this->isHidden()) { + hide(); + //e->ignore(); + e->accept(); + return; } - - void GUI::handleDownloadFromUrlFailure(QString url, QString reason) const{ - // Display a message box - QMessageBox::critical(0, tr("Url download error"), tr("Couldn't download file at url: %1, reason: %2.").arg(url).arg(reason)); - } - - void GUI::on_actionSet_global_upload_limit_triggered() { - qDebug("actionSet_global_upload_limit_triggered"); - new BandwidthAllocationDialog(this, true, BTSession, QStringList()); - } - - void GUI::on_actionShow_console_triggered() { - new consoleDlg(this, BTSession); - } - - void GUI::on_actionSet_global_download_limit_triggered() { - qDebug("actionSet_global_download_limit_triggered"); - new BandwidthAllocationDialog(this, false, BTSession, QStringList()); - } - - void GUI::on_actionPreview_file_triggered() { - QString hash; - switch(tabs->currentIndex()){ - case 0: - hash = downloadingTorrentTab->getSelectedTorrents(true).first(); - break; - case 1: - hash = finishedTorrentTab->getSelectedTorrents(true).first(); - break; - default: - return; - } - QTorrentHandle h = BTSession->getTorrentHandle(hash); - new previewSelect(this, h); - } - - void GUI::openDestinationFolder() const { - QStringList hashes; - switch(tabs->currentIndex()){ - case 0: - hashes = downloadingTorrentTab->getSelectedTorrents(true); - break; - case 1: - hashes = finishedTorrentTab->getSelectedTorrents(true); - break; - default: - return; - } - QStringList pathsList; - foreach(const QString &hash, hashes) { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - QString savePath = h.save_path(); - if(!pathsList.contains(savePath)) { - pathsList.append(savePath); - QDesktopServices::openUrl(QString("file://")+savePath); + if(settings.value(QString::fromUtf8("Preferences/General/ExitConfirm"), true).toBool() && downloadingTorrentTab->getNbTorrentsInList()) { + show(); + if(!isMaximized()) + showNormal(); + if(e->spontaneous() == true || force_exit == true) { + if(QMessageBox::question(this, + tr("Are you sure you want to quit?")+QString::fromUtf8(" -- ")+tr("qBittorrent"), + tr("The download list is not empty.\nAre you sure you want to quit qBittorrent?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1)) { + e->ignore(); + force_exit = false; + return; } } } - - void GUI::copyMagnetURI() const { - QStringList hashes; - switch(tabs->currentIndex()){ - case 0: - hashes = downloadingTorrentTab->getSelectedTorrents(); - break; - case 1: - hashes = finishedTorrentTab->getSelectedTorrents(); - break; - default: - return; - } - QStringList magnet_uris; - foreach(QString hash, hashes) { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(h.is_valid()) { - magnet_uris << misc::toQString(make_magnet_uri(h.get_torrent_info())); - } - } - qApp->clipboard()->setText(magnet_uris.join("\n")); - } - - void GUI::goBuyPage() const { - QStringList hashes; - switch(tabs->currentIndex()){ - case 0: - hashes = downloadingTorrentTab->getSelectedTorrents(true); - break; - case 1: - hashes = finishedTorrentTab->getSelectedTorrents(true); - break; - default: - return; - } - QStringList pathsList; - foreach(const QString &hash, hashes) { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - QDesktopServices::openUrl("http://match.sharemonkey.com/?info_hash="+hash+"&n="+h.name()+"&cid=33"); - } + hide(); + if(systrayIntegration) { + // Hide tray icon + myTrayIcon->hide(); } - - // Necessary if we want to close the window - // in one time if "close to systray" is enabled - void GUI::on_actionExit_triggered() { - force_exit = true; - close(); - } - - void GUI::previewFile(QString filePath) { - QDesktopServices::openUrl(QString("file://")+filePath); - } - - int GUI::getCurrentTabIndex() const{ - if(isMinimized() || isHidden()) - return -1; - return tabs->currentIndex(); - } - - void GUI::setTabText(int index, QString text) const { - tabs->setTabText(index, text); - } - - // Toggle Main window visibility - void GUI::toggleVisibility(QSystemTrayIcon::ActivationReason e) { - if(e == QSystemTrayIcon::Trigger || e == QSystemTrayIcon::DoubleClick) { - if(isHidden()) { - show(); - if(isMinimized()) { - if(isMaximized()) { - showMaximized(); - }else{ - showNormal(); - } - } - raise(); - activateWindow(); - }else{ + // Save window size, columns size + writeSettings(); + // Accept exit + e->accept(); + qApp->exit(); +} + + +// Display window to create a torrent +void GUI::on_actionCreate_torrent_triggered() { + createtorrent *ct = new createtorrent(this); + connect(ct, SIGNAL(torrent_to_seed(QString)), this, SLOT(addTorrent(QString))); +} + +bool GUI::event(QEvent * e) { + if(e->type() == QEvent::WindowStateChange) { + //Now check to see if the window is minimised + if(isMinimized()) { + qDebug("minimisation"); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + if(systrayIntegration && settings.value(QString::fromUtf8("Preferences/General/MinimizeToTray"), false).toBool()) { hide(); } } } - - // Center window - QPoint GUI::screenCenter() const{ - int scrn = 0; - QWidget *w = this->topLevelWidget(); - - if(w) - scrn = QApplication::desktop()->screenNumber(w); - else if(QApplication::desktop()->isVirtualDesktop()) - scrn = QApplication::desktop()->screenNumber(QCursor::pos()); - else - scrn = QApplication::desktop()->screenNumber(this); - - QRect desk(QApplication::desktop()->availableGeometry(scrn)); - return QPoint((desk.width() - this->frameGeometry().width()) / 2, (desk.height() - this->frameGeometry().height()) / 2); - } - - // Display About Dialog - void GUI::on_actionAbout_triggered() { - //About dialog - new about(this); - } - - void GUI::showEvent(QShowEvent *e) { - qDebug("** Show Event **"); - updateLists(true); - e->accept(); - } - - // Called when we close the program - void GUI::closeEvent(QCloseEvent *e) { - - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - bool goToSystrayOnExit = settings.value(QString::fromUtf8("Preferences/General/CloseToTray"), false).toBool(); - if(!force_exit && systrayIntegration && goToSystrayOnExit && !this->isHidden()) { - hide(); - //e->ignore(); - e->accept(); - return; - } - if(settings.value(QString::fromUtf8("Preferences/General/ExitConfirm"), true).toBool() && downloadingTorrentTab->getNbTorrentsInList()) { - show(); - if(!isMaximized()) - showNormal(); - if(e->spontaneous() == true || force_exit == true) { - if(QMessageBox::question(this, - tr("Are you sure you want to quit?")+QString::fromUtf8(" -- ")+tr("qBittorrent"), - tr("The download list is not empty.\nAre you sure you want to quit qBittorrent?"), - tr("&Yes"), tr("&No"), - QString(), 0, 1)) { - e->ignore(); - force_exit = false; - return; - } - } - } - hide(); - if(systrayIntegration) { - // Hide tray icon - myTrayIcon->hide(); + return QMainWindow::event(e); +} + +// Action executed when a file is dropped +void GUI::dropEvent(QDropEvent *event) { + event->acceptProposedAction(); + QStringList files; + if(event->mimeData()->hasUrls()) { + QList urls = event->mimeData()->urls(); + foreach(const QUrl &url, urls) { + QString tmp = url.toString().trimmed(); + if(!tmp.isEmpty()) + files << url.toString(); + } + } else { + files = event->mimeData()->text().split(QString::fromUtf8("\n")); + } + // Add file to download list + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); + foreach(QString file, files) { + file = file.trimmed().replace(QString::fromUtf8("file://"), QString::fromUtf8(""), Qt::CaseInsensitive); + qDebug("Dropped file %s on download list", file.toLocal8Bit().data()); + if(file.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || file.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || file.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) { + BTSession->downloadFromUrl(file); + continue; + } + if(file.startsWith("magnet:", Qt::CaseInsensitive)) { + // FIXME: Possibly skipped torrent addition dialog + BTSession->addMagnetUri(file); + continue; } - // Save window size, columns size - writeSettings(); - // Accept exit - e->accept(); - qApp->exit(); - } - - - // Display window to create a torrent - void GUI::on_actionCreate_torrent_triggered() { - createtorrent *ct = new createtorrent(this); - connect(ct, SIGNAL(torrent_to_seed(QString)), this, SLOT(addTorrent(QString))); - } - - bool GUI::event(QEvent * e) { - if(e->type() == QEvent::WindowStateChange) { - //Now check to see if the window is minimised - if(isMinimized()) { - qDebug("minimisation"); - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - if(systrayIntegration && settings.value(QString::fromUtf8("Preferences/General/MinimizeToTray"), false).toBool()) { - hide(); - } - } + if(useTorrentAdditionDialog) { + torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession); + dialog->showLoad(file); + }else{ + BTSession->addTorrent(file); } - return QMainWindow::event(e); } - - // Action executed when a file is dropped - void GUI::dropEvent(QDropEvent *event) { +} + +// Decode if we accept drag 'n drop or not +void GUI::dragEnterEvent(QDragEnterEvent *event) { + foreach(const QString &mime, event->mimeData()->formats()){ + qDebug("mimeData: %s", mime.toLocal8Bit().data()); + } + if (event->mimeData()->hasFormat(QString::fromUtf8("text/plain")) || event->mimeData()->hasFormat(QString::fromUtf8("text/uri-list"))) { event->acceptProposedAction(); - QStringList files; - if(event->mimeData()->hasUrls()) { - QList urls = event->mimeData()->urls(); - foreach(const QUrl &url, urls) { - QString tmp = url.toString().trimmed(); - if(!tmp.isEmpty()) - files << url.toString(); - } - } else { - files = event->mimeData()->text().split(QString::fromUtf8("\n")); - } - // Add file to download list - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + } +} + +/***************************************************** + * * + * Torrent * + * * + *****************************************************/ + +// Display a dialog to allow user to add +// torrents to download list +void GUI::on_actionOpen_triggered() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + // Open File Open Dialog + // Note: it is possible to select more than one file + QStringList pathsList = QFileDialog::getOpenFileNames(0, + tr("Open Torrent Files"), settings.value(QString::fromUtf8("MainWindowLastDir"), QDir::homePath()).toString(), + tr("Torrent Files")+QString::fromUtf8(" (*.torrent)")); + if(!pathsList.empty()) { bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); - foreach(QString file, files) { - file = file.trimmed().replace(QString::fromUtf8("file://"), QString::fromUtf8(""), Qt::CaseInsensitive); - qDebug("Dropped file %s on download list", file.toLocal8Bit().data()); - if(file.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || file.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || file.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) { - BTSession->downloadFromUrl(file); - continue; - } - if(file.startsWith("magnet:", Qt::CaseInsensitive)) { - // FIXME: Possibly skipped torrent addition dialog - BTSession->addMagnetUri(file); - continue; - } + unsigned int listSize = pathsList.size(); + for(unsigned int i=0; ishowLoad(file); + dialog->showLoad(pathsList.at(i)); }else{ - BTSession->addTorrent(file); + BTSession->addTorrent(pathsList.at(i)); } } + // Save last dir to remember it + QStringList top_dir = pathsList.at(0).split(QDir::separator()); + top_dir.removeLast(); + settings.setValue(QString::fromUtf8("MainWindowLastDir"), top_dir.join(QDir::separator())); } - - // Decode if we accept drag 'n drop or not - void GUI::dragEnterEvent(QDragEnterEvent *event) { - foreach(const QString &mime, event->mimeData()->formats()){ - qDebug("mimeData: %s", mime.toLocal8Bit().data()); - } - if (event->mimeData()->hasFormat(QString::fromUtf8("text/plain")) || event->mimeData()->hasFormat(QString::fromUtf8("text/uri-list"))) { - event->acceptProposedAction(); - } +} + +// delete from download list AND from hard drive +void GUI::on_actionDelete_Permanently_triggered() { + QStringList hashes; + bool inDownloadList = true; + switch(tabs->currentIndex()){ + case 0: + hashes = downloadingTorrentTab->getSelectedTorrents(); + break; + case 1: + hashes = finishedTorrentTab->getSelectedTorrents(); + inDownloadList = false; + break; + default: + return; + } + if(hashes.empty()) return; + int ret; + if(inDownloadList) { + ret = QMessageBox::question( + this, + tr("Are you sure? -- qBittorrent"), + tr("Are you sure you want to delete the selected item(s) from download list and from hard drive?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1); + }else{ + ret = QMessageBox::question( + this, + tr("Are you sure? -- qBittorrent"), + tr("Are you sure you want to delete the selected item(s) from finished list and from hard drive?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1); + } + if(ret) return; + //User clicked YES + foreach(const QString &hash, hashes) { + // Get the file name + QTorrentHandle h = BTSession->getTorrentHandle(hash); + QString fileName = h.name(); + // Remove the torrent + BTSession->deleteTorrent(hash, true); } - - /***************************************************** - * * - * Torrent * - * * - *****************************************************/ - - // Display a dialog to allow user to add - // torrents to download list - void GUI::on_actionOpen_triggered() { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - // Open File Open Dialog - // Note: it is possible to select more than one file - QStringList pathsList = QFileDialog::getOpenFileNames(0, - tr("Open Torrent Files"), settings.value(QString::fromUtf8("MainWindowLastDir"), QDir::homePath()).toString(), - tr("Torrent Files")+QString::fromUtf8(" (*.torrent)")); - if(!pathsList.empty()) { - bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); - unsigned int listSize = pathsList.size(); - for(unsigned int i=0; ideleteTorrent(hash); + finishedTorrentTab->deleteTorrent(hash); +} + +// delete selected items in the list +void GUI::on_actionDelete_triggered() { + QStringList hashes; + bool inDownloadList = true; + switch(tabs->currentIndex()){ + case 0: // DL + hashes = downloadingTorrentTab->getSelectedTorrents(); + break; + case 1: // SEED + hashes = finishedTorrentTab->getSelectedTorrents(); + inDownloadList = false; + break; + case 3: //RSSImp + rssWidget->deleteSelectedItems(); + return; + default: + return; + } + if(hashes.empty()) return; + int ret; + if(inDownloadList) { + ret = QMessageBox::question( + this, + tr("Are you sure? -- qBittorrent"), + tr("Are you sure you want to delete the selected item(s) in download list?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1); + } else { + ret = QMessageBox::question( + this, + tr("Are you sure? -- qBittorrent"), + tr("Are you sure you want to delete the selected item(s) in finished list?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1); + } + if(ret) return; + //User clicked YES + foreach(const QString &hash, hashes) { + // Get the file name + QTorrentHandle h = BTSession->getTorrentHandle(hash); + QString fileName = h.name(); + // Remove the torrent + BTSession->deleteTorrent(hash, false); + } +} + +// As program parameters, we can get paths or urls. +// This function parse the parameters and call +// the right addTorrent function, considering +// the parameter type. +void GUI::processParams(const QStringList& params) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); + foreach(QString param, params) { + param = param.trimmed(); + if(param.startsWith("--")) continue; + if(param.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) { + BTSession->downloadFromUrl(param); + }else{ + if(param.startsWith("magnet:", Qt::CaseInsensitive)) { + // FIXME: Possibily skipped torrent addition dialog + BTSession->addMagnetUri(param); + } else { if(useTorrentAdditionDialog) { torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession); - dialog->showLoad(pathsList.at(i)); + dialog->showLoad(param); }else{ - BTSession->addTorrent(pathsList.at(i)); - } - } - // Save last dir to remember it - QStringList top_dir = pathsList.at(0).split(QDir::separator()); - top_dir.removeLast(); - settings.setValue(QString::fromUtf8("MainWindowLastDir"), top_dir.join(QDir::separator())); - } - } - - // delete from download list AND from hard drive - void GUI::on_actionDelete_Permanently_triggered() { - QStringList hashes; - bool inDownloadList = true; - switch(tabs->currentIndex()){ - case 0: - hashes = downloadingTorrentTab->getSelectedTorrents(); - break; - case 1: - hashes = finishedTorrentTab->getSelectedTorrents(); - inDownloadList = false; - break; - default: - return; - } - if(hashes.empty()) return; - int ret; - if(inDownloadList) { - ret = QMessageBox::question( - this, - tr("Are you sure? -- qBittorrent"), - tr("Are you sure you want to delete the selected item(s) from download list and from hard drive?"), - tr("&Yes"), tr("&No"), - QString(), 0, 1); - }else{ - ret = QMessageBox::question( - this, - tr("Are you sure? -- qBittorrent"), - tr("Are you sure you want to delete the selected item(s) from finished list and from hard drive?"), - tr("&Yes"), tr("&No"), - QString(), 0, 1); - } - if(ret) return; - //User clicked YES - foreach(const QString &hash, hashes) { - // Get the file name - QTorrentHandle h = BTSession->getTorrentHandle(hash); - QString fileName = h.name(); - // Remove the torrent - BTSession->deleteTorrent(hash, true); - } - } - - void GUI::deleteTorrent(QString hash) { - // Delete item from list - downloadingTorrentTab->deleteTorrent(hash); - finishedTorrentTab->deleteTorrent(hash); - } - - // delete selected items in the list - void GUI::on_actionDelete_triggered() { - QStringList hashes; - bool inDownloadList = true; - switch(tabs->currentIndex()){ - case 0: // DL - hashes = downloadingTorrentTab->getSelectedTorrents(); - break; - case 1: // SEED - hashes = finishedTorrentTab->getSelectedTorrents(); - inDownloadList = false; - break; - case 3: //RSSImp - rssWidget->deleteSelectedItems(); - return; - default: - return; - } - if(hashes.empty()) return; - int ret; - if(inDownloadList) { - ret = QMessageBox::question( - this, - tr("Are you sure? -- qBittorrent"), - tr("Are you sure you want to delete the selected item(s) in download list?"), - tr("&Yes"), tr("&No"), - QString(), 0, 1); - } else { - ret = QMessageBox::question( - this, - tr("Are you sure? -- qBittorrent"), - tr("Are you sure you want to delete the selected item(s) in finished list?"), - tr("&Yes"), tr("&No"), - QString(), 0, 1); - } - if(ret) return; - //User clicked YES - foreach(const QString &hash, hashes) { - // Get the file name - QTorrentHandle h = BTSession->getTorrentHandle(hash); - QString fileName = h.name(); - // Remove the torrent - BTSession->deleteTorrent(hash, false); - } - } - - // As program parameters, we can get paths or urls. - // This function parse the parameters and call - // the right addTorrent function, considering - // the parameter type. - void GUI::processParams(const QStringList& params) { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); - foreach(QString param, params) { - param = param.trimmed(); - if(param.startsWith("--")) continue; - if(param.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) { - BTSession->downloadFromUrl(param); - }else{ - if(param.startsWith("magnet:", Qt::CaseInsensitive)) { - // FIXME: Possibily skipped torrent addition dialog - BTSession->addMagnetUri(param); - } else { - if(useTorrentAdditionDialog) { - torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession); - dialog->showLoad(param); - }else{ - BTSession->addTorrent(param); - } + BTSession->addTorrent(param); } } } } - - void GUI::addTorrent(QString path) { - BTSession->addTorrent(path); - } - - void GUI::processDownloadedFiles(QString path, QString url) { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); - if(useTorrentAdditionDialog) { - torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession); - dialog->showLoad(path, url); - }else{ - BTSession->addTorrent(path, false, url); - } +} + +void GUI::addTorrent(QString path) { + BTSession->addTorrent(path); +} + +void GUI::processDownloadedFiles(QString path, QString url) { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool(); + if(useTorrentAdditionDialog) { + torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession); + dialog->showLoad(path, url); + }else{ + BTSession->addTorrent(path, false, url); } - - // Set BT session configuration - void GUI::configureSession(bool deleteOptions) { - qDebug("Configuring session"); - // General - bool new_displaySpeedInTitle = options->speedInTitleBar(); - if(!new_displaySpeedInTitle && new_displaySpeedInTitle != displaySpeedInTitle) { - // Reset title - setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent v0.x").arg(QString::fromUtf8(VERSION))); - } - displaySpeedInTitle = new_displaySpeedInTitle; - if(options->isToolbarDisplayed()) { - toolBar->setVisible(true); +} + +// Set BT session configuration +void GUI::configureSession(bool deleteOptions) { + qDebug("Configuring session"); + // General + bool new_displaySpeedInTitle = options->speedInTitleBar(); + if(!new_displaySpeedInTitle && new_displaySpeedInTitle != displaySpeedInTitle) { + // Reset title + setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent v0.x").arg(QString::fromUtf8(VERSION))); + } + displaySpeedInTitle = new_displaySpeedInTitle; + if(options->isToolbarDisplayed()) { + toolBar->setVisible(true); + toolBar->layout()->setSpacing(7); + } else { + toolBar->setVisible(false); + } + unsigned int new_refreshInterval = options->getRefreshInterval(); + if(refreshInterval != new_refreshInterval) { + refreshInterval = new_refreshInterval; + refresher->start(refreshInterval); + } + // Downloads + // * Save path + BTSession->setDefaultSavePath(options->getSavePath()); + if(options->isTempPathEnabled()) { + BTSession->setDefaultTempPath(options->getTempPath()); + } else { + BTSession->setDefaultTempPath(QString::null); + } + BTSession->preAllocateAllFiles(options->preAllocateAllFiles()); + BTSession->startTorrentsInPause(options->addTorrentsInPause()); + // * Scan dir + if(options->getScanDir().isNull()) { + BTSession->disableDirectoryScanning(); + }else{ + //Interval first + BTSession->enableDirectoryScanning(options->getScanDir()); + } + // Connection + // * Ports binding + unsigned short old_listenPort = BTSession->getListenPort(); + BTSession->setListeningPort(options->getPort()); + unsigned short new_listenPort = BTSession->getListenPort(); + if(new_listenPort != old_listenPort) { + BTSession->addConsoleMessage(tr("qBittorrent is bound to port: TCP/%1", "e.g: qBittorrent is bound to port: 6881").arg( misc::toQString(new_listenPort))); + } + // * Global download limit + QPair limits = options->getGlobalBandwidthLimits(); + if(limits.first <= 0) { + // Download limit disabled + BTSession->setDownloadRateLimit(-1); + } else { + // Enabled + BTSession->setDownloadRateLimit(limits.first*1024); + } + // * Global Upload limit + if(limits.second <= 0) { + // Upload limit disabled + BTSession->setUploadRateLimit(-1); + } else { + // Enabled + BTSession->setUploadRateLimit(limits.second*1024); + } + // * UPnP + if(options->isUPnPEnabled()) { + BTSession->enableUPnP(true); + BTSession->addConsoleMessage(tr("UPnP support [ON]"), QString::fromUtf8("blue")); + } else { + BTSession->enableUPnP(false); + BTSession->addConsoleMessage(tr("UPnP support [OFF]"), QString::fromUtf8("blue")); + } + // * NAT-PMP + if(options->isNATPMPEnabled()) { + BTSession->enableNATPMP(true); + BTSession->addConsoleMessage(tr("NAT-PMP support [ON]"), QString::fromUtf8("blue")); + } else { + BTSession->enableNATPMP(false); + BTSession->addConsoleMessage(tr("NAT-PMP support [OFF]"), QString::fromUtf8("blue")); + } + // * Session settings + session_settings sessionSettings; + if(options->shouldSpoofAzureus()) { + sessionSettings.user_agent = "Azureus 3.0.5.2"; + } else { + sessionSettings.user_agent = "qBittorrent "VERSION; + } + sessionSettings.upnp_ignore_nonrouters = true; + sessionSettings.use_dht_as_fallback = false; + // To keep same behavior as in qbittorrent v1.2.0 + sessionSettings.rate_limit_ip_overhead = false; + // Queueing System + if(options->isQueueingSystemEnabled()) { + if(!BTSession->isQueueingEnabled()) { + downloadingTorrentTab->hidePriorityColumn(false); + actionDecreasePriority->setVisible(true); + actionIncreasePriority->setVisible(true); + prioSeparator->setVisible(true); + prioSeparator2->setVisible(true); toolBar->layout()->setSpacing(7); - } else { - toolBar->setVisible(false); - } - unsigned int new_refreshInterval = options->getRefreshInterval(); - if(refreshInterval != new_refreshInterval) { - refreshInterval = new_refreshInterval; - refresher->start(refreshInterval); - } - // Downloads - // * Save path - BTSession->setDefaultSavePath(options->getSavePath()); - if(options->isTempPathEnabled()) { - BTSession->setDefaultTempPath(options->getTempPath()); - } else { - BTSession->setDefaultTempPath(QString::null); } - BTSession->preAllocateAllFiles(options->preAllocateAllFiles()); - BTSession->startTorrentsInPause(options->addTorrentsInPause()); - // * Scan dir - if(options->getScanDir().isNull()) { - BTSession->disableDirectoryScanning(); - }else{ - //Interval first - BTSession->enableDirectoryScanning(options->getScanDir()); - } - // Connection - // * Ports binding - unsigned short old_listenPort = BTSession->getListenPort(); - BTSession->setListeningPort(options->getPort()); - unsigned short new_listenPort = BTSession->getListenPort(); - if(new_listenPort != old_listenPort) { - BTSession->addConsoleMessage(tr("qBittorrent is bound to port: TCP/%1", "e.g: qBittorrent is bound to port: 6881").arg( misc::toQString(new_listenPort))); - } - // * Global download limit - QPair limits = options->getGlobalBandwidthLimits(); - if(limits.first <= 0) { - // Download limit disabled - BTSession->setDownloadRateLimit(-1); - } else { - // Enabled - BTSession->setDownloadRateLimit(limits.first*1024); - } - // * Global Upload limit - if(limits.second <= 0) { - // Upload limit disabled - BTSession->setUploadRateLimit(-1); - } else { - // Enabled - BTSession->setUploadRateLimit(limits.second*1024); - } - // * UPnP - if(options->isUPnPEnabled()) { - BTSession->enableUPnP(true); - BTSession->addConsoleMessage(tr("UPnP support [ON]"), QString::fromUtf8("blue")); - } else { - BTSession->enableUPnP(false); - BTSession->addConsoleMessage(tr("UPnP support [OFF]"), QString::fromUtf8("blue")); - } - // * NAT-PMP - if(options->isNATPMPEnabled()) { - BTSession->enableNATPMP(true); - BTSession->addConsoleMessage(tr("NAT-PMP support [ON]"), QString::fromUtf8("blue")); - } else { - BTSession->enableNATPMP(false); - BTSession->addConsoleMessage(tr("NAT-PMP support [OFF]"), QString::fromUtf8("blue")); - } - // * Session settings - session_settings sessionSettings; - if(options->shouldSpoofAzureus()) { - sessionSettings.user_agent = "Azureus 3.0.5.2"; - } else { - sessionSettings.user_agent = "qBittorrent "VERSION; - } - sessionSettings.upnp_ignore_nonrouters = true; - sessionSettings.use_dht_as_fallback = false; - // To keep same behavior as in qbittorrent v1.2.0 - sessionSettings.rate_limit_ip_overhead = false; - // Queueing System - if(options->isQueueingSystemEnabled()) { - if(!BTSession->isQueueingEnabled()) { - downloadingTorrentTab->hidePriorityColumn(false); - actionDecreasePriority->setVisible(true); - actionIncreasePriority->setVisible(true); - prioSeparator->setVisible(true); - prioSeparator2->setVisible(true); - toolBar->layout()->setSpacing(7); - } - int max_torrents = options->getMaxActiveTorrents(); - int max_uploads = options->getMaxActiveUploads(); - int max_downloads = options->getMaxActiveDownloads(); - sessionSettings.active_downloads = max_downloads; - sessionSettings.active_seeds = max_uploads; - sessionSettings.active_limit = max_torrents; - sessionSettings.dont_count_slow_torrents = false; - BTSession->setQueueingEnabled(true); - } else { - if(BTSession->isQueueingEnabled()) { - sessionSettings.active_downloads = -1; - sessionSettings.active_seeds = -1; - sessionSettings.active_limit = -1; - BTSession->setQueueingEnabled(false); - downloadingTorrentTab->hidePriorityColumn(true); - actionDecreasePriority->setVisible(false); - actionIncreasePriority->setVisible(false); - prioSeparator->setVisible(false); - prioSeparator2->setVisible(false); - toolBar->layout()->setSpacing(7); - } - } - BTSession->setSessionSettings(sessionSettings); - // Bittorrent - // * Max connections limit - BTSession->setMaxConnections(options->getMaxConnecs()); - // * Max connections per torrent limit - BTSession->setMaxConnectionsPerTorrent(options->getMaxConnecsPerTorrent()); - // * Max uploads per torrent limit - BTSession->setMaxUploadsPerTorrent(options->getMaxUploadsPerTorrent()); - // * DHT - if(options->isDHTEnabled()) { - // Set DHT Port - BTSession->setDHTPort(options->getDHTPort()); - if(BTSession->enableDHT(true)) { - int dht_port = new_listenPort; - if(options->getDHTPort()) - dht_port = options->getDHTPort(); - BTSession->addConsoleMessage(tr("DHT support [ON], port: UDP/%1").arg(dht_port), QString::fromUtf8("blue")); - } else { - BTSession->addConsoleMessage(tr("DHT support [OFF]"), QString::fromUtf8("red")); - } - } else { - BTSession->enableDHT(false); - BTSession->addConsoleMessage(tr("DHT support [OFF]"), QString::fromUtf8("blue")); + int max_torrents = options->getMaxActiveTorrents(); + int max_uploads = options->getMaxActiveUploads(); + int max_downloads = options->getMaxActiveDownloads(); + sessionSettings.active_downloads = max_downloads; + sessionSettings.active_seeds = max_uploads; + sessionSettings.active_limit = max_torrents; + sessionSettings.dont_count_slow_torrents = false; + BTSession->setQueueingEnabled(true); + } else { + if(BTSession->isQueueingEnabled()) { + sessionSettings.active_downloads = -1; + sessionSettings.active_seeds = -1; + sessionSettings.active_limit = -1; + BTSession->setQueueingEnabled(false); + downloadingTorrentTab->hidePriorityColumn(true); + actionDecreasePriority->setVisible(false); + actionIncreasePriority->setVisible(false); + prioSeparator->setVisible(false); + prioSeparator2->setVisible(false); + toolBar->layout()->setSpacing(7); } - // * PeX - BTSession->addConsoleMessage(tr("PeX support [ON]"), QString::fromUtf8("blue")); - // * LSD - if(options->isLSDEnabled()) { - BTSession->enableLSD(true); - BTSession->addConsoleMessage(tr("Local Peer Discovery [ON]"), QString::fromUtf8("blue")); + } + BTSession->setSessionSettings(sessionSettings); + // Bittorrent + // * Max connections limit + BTSession->setMaxConnections(options->getMaxConnecs()); + // * Max connections per torrent limit + BTSession->setMaxConnectionsPerTorrent(options->getMaxConnecsPerTorrent()); + // * Max uploads per torrent limit + BTSession->setMaxUploadsPerTorrent(options->getMaxUploadsPerTorrent()); + // * DHT + if(options->isDHTEnabled()) { + // Set DHT Port + BTSession->setDHTPort(options->getDHTPort()); + if(BTSession->enableDHT(true)) { + int dht_port = new_listenPort; + if(options->getDHTPort()) + dht_port = options->getDHTPort(); + BTSession->addConsoleMessage(tr("DHT support [ON], port: UDP/%1").arg(dht_port), QString::fromUtf8("blue")); } else { - BTSession->enableLSD(false); - BTSession->addConsoleMessage(tr("Local Peer Discovery support [OFF]"), QString::fromUtf8("blue")); - } - // * Encryption - int encryptionState = options->getEncryptionSetting(); - // The most secure, rc4 only so that all streams and encrypted - pe_settings encryptionSettings; - encryptionSettings.allowed_enc_level = pe_settings::rc4; - encryptionSettings.prefer_rc4 = true; - switch(encryptionState) { - case 0: //Enabled - encryptionSettings.out_enc_policy = pe_settings::enabled; - encryptionSettings.in_enc_policy = pe_settings::enabled; - BTSession->addConsoleMessage(tr("Encryption support [ON]"), QString::fromUtf8("blue")); + BTSession->addConsoleMessage(tr("DHT support [OFF]"), QString::fromUtf8("red")); + } + } else { + BTSession->enableDHT(false); + BTSession->addConsoleMessage(tr("DHT support [OFF]"), QString::fromUtf8("blue")); + } + // * PeX + BTSession->addConsoleMessage(tr("PeX support [ON]"), QString::fromUtf8("blue")); + // * LSD + if(options->isLSDEnabled()) { + BTSession->enableLSD(true); + BTSession->addConsoleMessage(tr("Local Peer Discovery [ON]"), QString::fromUtf8("blue")); + } else { + BTSession->enableLSD(false); + BTSession->addConsoleMessage(tr("Local Peer Discovery support [OFF]"), QString::fromUtf8("blue")); + } + // * Encryption + int encryptionState = options->getEncryptionSetting(); + // The most secure, rc4 only so that all streams and encrypted + pe_settings encryptionSettings; + encryptionSettings.allowed_enc_level = pe_settings::rc4; + encryptionSettings.prefer_rc4 = true; + switch(encryptionState) { + case 0: //Enabled + encryptionSettings.out_enc_policy = pe_settings::enabled; + encryptionSettings.in_enc_policy = pe_settings::enabled; + BTSession->addConsoleMessage(tr("Encryption support [ON]"), QString::fromUtf8("blue")); + break; + case 1: // Forced + encryptionSettings.out_enc_policy = pe_settings::forced; + encryptionSettings.in_enc_policy = pe_settings::forced; + BTSession->addConsoleMessage(tr("Encryption support [FORCED]"), QString::fromUtf8("blue")); + break; + default: // Disabled + encryptionSettings.out_enc_policy = pe_settings::disabled; + encryptionSettings.in_enc_policy = pe_settings::disabled; + BTSession->addConsoleMessage(tr("Encryption support [OFF]"), QString::fromUtf8("blue")); + } + BTSession->applyEncryptionSettings(encryptionSettings); + // * Desired ratio + BTSession->setGlobalRatio(options->getDesiredRatio()); + // * Maximum ratio + BTSession->setDeleteRatio(options->getDeleteRatio()); + // Ip Filter + if(options->isFilteringEnabled()) { + BTSession->enableIPFilter(options->getFilter()); + }else{ + BTSession->disableIPFilter(); + } + // RSS + if(options->isRSSEnabled()) { + displayRSSTab(true); + } else { + displayRSSTab(false); + } + // * Proxy settings + proxy_settings proxySettings; + if(options->isProxyEnabled()) { + qDebug("Enabling P2P proxy"); + proxySettings.hostname = options->getProxyIp().toStdString(); + qDebug("hostname is %s", proxySettings.hostname.c_str()); + proxySettings.port = options->getProxyPort(); + qDebug("port is %d", proxySettings.port); + if(options->isProxyAuthEnabled()) { + + proxySettings.username = options->getProxyUsername().toStdString(); + proxySettings.password = options->getProxyPassword().toStdString(); + qDebug("username is %s", proxySettings.username.c_str()); + qDebug("password is %s", proxySettings.password.c_str()); + } + switch(options->getProxyType()) { + case HTTP: + qDebug("type: http"); + proxySettings.type = proxy_settings::http; break; - case 1: // Forced - encryptionSettings.out_enc_policy = pe_settings::forced; - encryptionSettings.in_enc_policy = pe_settings::forced; - BTSession->addConsoleMessage(tr("Encryption support [FORCED]"), QString::fromUtf8("blue")); + case HTTP_PW: + qDebug("type: http_pw"); + proxySettings.type = proxy_settings::http_pw; + break; + case SOCKS5: + qDebug("type: socks5"); + proxySettings.type = proxy_settings::socks5; + break; + default: + qDebug("type: socks5_pw"); + proxySettings.type = proxy_settings::socks5_pw; break; - default: // Disabled - encryptionSettings.out_enc_policy = pe_settings::disabled; - encryptionSettings.in_enc_policy = pe_settings::disabled; - BTSession->addConsoleMessage(tr("Encryption support [OFF]"), QString::fromUtf8("blue")); - } - BTSession->applyEncryptionSettings(encryptionSettings); - // * Desired ratio - BTSession->setGlobalRatio(options->getDesiredRatio()); - // * Maximum ratio - BTSession->setDeleteRatio(options->getDeleteRatio()); - // Ip Filter - if(options->isFilteringEnabled()) { - BTSession->enableIPFilter(options->getFilter()); - }else{ - BTSession->disableIPFilter(); - } - // RSS - if(options->isRSSEnabled()) { - displayRSSTab(true); - } else { - displayRSSTab(false); } - // * Proxy settings - proxy_settings proxySettings; - if(options->isProxyEnabled()) { - qDebug("Enabling P2P proxy"); - proxySettings.hostname = options->getProxyIp().toStdString(); - qDebug("hostname is %s", proxySettings.hostname.c_str()); - proxySettings.port = options->getProxyPort(); - qDebug("port is %d", proxySettings.port); - if(options->isProxyAuthEnabled()) { - - proxySettings.username = options->getProxyUsername().toStdString(); - proxySettings.password = options->getProxyPassword().toStdString(); - qDebug("username is %s", proxySettings.username.c_str()); - qDebug("password is %s", proxySettings.password.c_str()); - } - switch(options->getProxyType()) { - case HTTP: - qDebug("type: http"); - proxySettings.type = proxy_settings::http; - break; - case HTTP_PW: - qDebug("type: http_pw"); - proxySettings.type = proxy_settings::http_pw; - break; - case SOCKS5: - qDebug("type: socks5"); - proxySettings.type = proxy_settings::socks5; - break; - default: - qDebug("type: socks5_pw"); - proxySettings.type = proxy_settings::socks5_pw; - break; - } - qDebug("booleans: %d %d %d %d", options->useProxyForTrackers(), options->useProxyForPeers(), options->useProxyForWebseeds(), options->useProxyForDHT()); - BTSession->setProxySettings(proxySettings, options->useProxyForTrackers(), options->useProxyForPeers(), options->useProxyForWebseeds(), options->useProxyForDHT()); - } else { - qDebug("Disabling P2P proxy"); - BTSession->setProxySettings(proxySettings, false, false, false, false); + qDebug("booleans: %d %d %d %d", options->useProxyForTrackers(), options->useProxyForPeers(), options->useProxyForWebseeds(), options->useProxyForDHT()); + BTSession->setProxySettings(proxySettings, options->useProxyForTrackers(), options->useProxyForPeers(), options->useProxyForWebseeds(), options->useProxyForDHT()); + } else { + qDebug("Disabling P2P proxy"); + BTSession->setProxySettings(proxySettings, false, false, false, false); + } + if(options->isHTTPProxyEnabled()) { + qDebug("Enabling Search HTTP proxy"); + // HTTP Proxy + QString proxy_str; + switch(options->getHTTPProxyType()) { + case HTTP_PW: + proxy_str = misc::toQString("http://")+options->getHTTPProxyUsername()+":"+options->getHTTPProxyPassword()+"@"+options->getHTTPProxyIp()+":"+misc::toQString(options->getHTTPProxyPort()); + break; + default: + proxy_str = misc::toQString("http://")+options->getHTTPProxyIp()+":"+misc::toQString(options->getHTTPProxyPort()); } - if(options->isHTTPProxyEnabled()) { - qDebug("Enabling Search HTTP proxy"); - // HTTP Proxy - QString proxy_str; - switch(options->getHTTPProxyType()) { - case HTTP_PW: - proxy_str = misc::toQString("http://")+options->getHTTPProxyUsername()+":"+options->getHTTPProxyPassword()+"@"+options->getHTTPProxyIp()+":"+misc::toQString(options->getHTTPProxyPort()); - break; - default: - proxy_str = misc::toQString("http://")+options->getHTTPProxyIp()+":"+misc::toQString(options->getHTTPProxyPort()); - } - // We need this for urllib in search engine plugins + // We need this for urllib in search engine plugins #ifdef Q_WS_WIN - char proxystr[512]; - snprintf(proxystr, 512, "http_proxy=%s", proxy_str.toLocal8Bit().data()); - putenv(proxystr); + char proxystr[512]; + snprintf(proxystr, 512, "http_proxy=%s", proxy_str.toLocal8Bit().data()); + putenv(proxystr); #else - qDebug("HTTP: proxy string: %s", proxy_str.toLocal8Bit().data()); - setenv("http_proxy", proxy_str.toLocal8Bit().data(), 1); + qDebug("HTTP: proxy string: %s", proxy_str.toLocal8Bit().data()); + setenv("http_proxy", proxy_str.toLocal8Bit().data(), 1); #endif - } else { - qDebug("Disabling search proxy"); + } else { + qDebug("Disabling search proxy"); #ifdef Q_WS_WIN - putenv("http_proxy="); + putenv("http_proxy="); #else - unsetenv("http_proxy"); + unsetenv("http_proxy"); #endif + } + // Clean up + if(deleteOptions && options) { + qDebug("Deleting options"); + //delete options; + options->deleteLater(); + } + qDebug("Session configured"); +} + +void GUI::updateUnfinishedTorrentNumber(unsigned int nb) { + unsigned int paused = BTSession->getUnfinishedPausedTorrentsNb(); + tabs->setTabText(0, tr("Downloads") +QString::fromUtf8(" (")+misc::toQString(nb-paused)+"/"+misc::toQString(nb)+QString::fromUtf8(")")); +} + +void GUI::updateFinishedTorrentNumber(unsigned int nb) { + unsigned int paused = BTSession->getFinishedPausedTorrentsNb(); + tabs->setTabText(1, tr("Finished") +QString::fromUtf8(" (")+misc::toQString(nb-paused)+"/"+misc::toQString(nb)+QString::fromUtf8(")")); +} + +// Allow to change action on double-click +void GUI::torrentDoubleClicked(QString hash, bool finished) { + int action; + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + + if(finished) { + action = settings.value(QString::fromUtf8("Preferences/Downloads/DblClOnTorFN"), 0).toInt(); + } else { + action = settings.value(QString::fromUtf8("Preferences/Downloads/DblClOnTorDl"), 0).toInt(); + } + + switch(action) { + case TOGGLE_PAUSE: + this->togglePausedState(hash); + break; + case OPEN_DEST: { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + QString savePath = h.save_path(); + QDesktopServices::openUrl(QUrl(savePath)); + break; } - // Clean up - if(deleteOptions && options) { - qDebug("Deleting options"); - //delete options; - options->deleteLater(); - } - qDebug("Session configured"); - } - - void GUI::updateUnfinishedTorrentNumber(unsigned int nb) { - unsigned int paused = BTSession->getUnfinishedPausedTorrentsNb(); - tabs->setTabText(0, tr("Downloads") +QString::fromUtf8(" (")+misc::toQString(nb-paused)+"/"+misc::toQString(nb)+QString::fromUtf8(")")); - } - - void GUI::updateFinishedTorrentNumber(unsigned int nb) { - unsigned int paused = BTSession->getFinishedPausedTorrentsNb(); - tabs->setTabText(1, tr("Finished") +QString::fromUtf8(" (")+misc::toQString(nb-paused)+"/"+misc::toQString(nb)+QString::fromUtf8(")")); - } - - // Allow to change action on double-click - void GUI::torrentDoubleClicked(QString hash, bool finished) { - int action; - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - QTorrentHandle h = BTSession->getTorrentHandle(hash); - + case SHOW_PROPERTIES : if(finished) { - action = settings.value(QString::fromUtf8("Preferences/Downloads/DblClOnTorFN"), 0).toInt(); + finishedTorrentTab->showPropertiesFromHash(hash); } else { - action = settings.value(QString::fromUtf8("Preferences/Downloads/DblClOnTorDl"), 0).toInt(); + downloadingTorrentTab->showPropertiesFromHash(hash); } - - switch(action) { - case TOGGLE_PAUSE: - this->togglePausedState(hash); - break; - case OPEN_DEST: { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - QString savePath = h.save_path(); - QDesktopServices::openUrl(QUrl(savePath)); - break; - } - case SHOW_PROPERTIES : - if(finished) { - finishedTorrentTab->showPropertiesFromHash(hash); - } else { - downloadingTorrentTab->showPropertiesFromHash(hash); - } - break; + break; + } +} + +// Toggle paused state of selected torrent +void GUI::togglePausedState(QString hash) { + if(tabs->currentIndex() > 1) return; + bool inDownloadList = true; + if(tabs->currentIndex() == 1) + inDownloadList = false; + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(h.is_paused()) { + h.resume(); + resumedTorrent(h); + if(inDownloadList) { + updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); + }else{ + updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); + } + }else{ + h.pause(); + pausedTorrent(h); + if(inDownloadList) { + updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); + }else{ + updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); } } - - // Toggle paused state of selected torrent - void GUI::togglePausedState(QString hash) { - if(tabs->currentIndex() > 1) return; - bool inDownloadList = true; - if(tabs->currentIndex() == 1) - inDownloadList = false; +} + +// Pause All Downloads in DL list +void GUI::on_actionPause_All_triggered() { + bool change = false; + std::vector torrents = BTSession->getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid() || h.is_paused()) continue; + change = true; + h.pause(); + pausedTorrent(h); + } + if(change) { + updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); + updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); + } +} + +void GUI::on_actionIncreasePriority_triggered() { + if(tabs->currentIndex() != 0) + return; + QStringList hashes = downloadingTorrentTab->getSelectedTorrents(); + foreach(const QString &hash, hashes) { + BTSession->increaseDlTorrentPriority(hash); + } + updateLists(); +} + +void GUI::on_actionDecreasePriority_triggered() { + Q_ASSERT(tabs->currentIndex() == 0); + QStringList hashes = downloadingTorrentTab->getSelectedTorrents(); + foreach(const QString &hash, hashes) { + BTSession->decreaseDlTorrentPriority(hash); + } + updateLists(); +} + +// pause selected items in the list +void GUI::on_actionPause_triggered() { + bool inDownloadList = true; + if(tabs->currentIndex() > 1) return; + if(tabs->currentIndex() == 1) + inDownloadList = false; + QStringList hashes; + if(inDownloadList) { + hashes = downloadingTorrentTab->getSelectedTorrents(); + } else { + hashes = finishedTorrentTab->getSelectedTorrents(); + } + qDebug("nb hashes: %d", hashes.size()); + foreach(const QString &hash, hashes) { QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(h.is_paused()) { - h.resume(); - resumedTorrent(h); - if(inDownloadList) { - updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); - }else{ - updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); - } - }else{ + if(!h.is_paused()){ h.pause(); pausedTorrent(h); if(inDownloadList) { updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); - }else{ + } else { updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); } } } - - // Pause All Downloads in DL list - void GUI::on_actionPause_All_triggered() { - bool change = false; - std::vector torrents = BTSession->getTorrents(); - std::vector::iterator torrentIT; - for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { - QTorrentHandle h = QTorrentHandle(*torrentIT); - if(!h.is_valid() || h.is_paused()) continue; - change = true; - h.pause(); - pausedTorrent(h); - } - if(change) { - updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); - updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); - } - } - - void GUI::on_actionIncreasePriority_triggered() { - if(tabs->currentIndex() != 0) - return; - QStringList hashes = downloadingTorrentTab->getSelectedTorrents(); - foreach(const QString &hash, hashes) { - BTSession->increaseDlTorrentPriority(hash); - } - updateLists(); - } - - void GUI::on_actionDecreasePriority_triggered() { - Q_ASSERT(tabs->currentIndex() == 0); - QStringList hashes = downloadingTorrentTab->getSelectedTorrents(); - foreach(const QString &hash, hashes) { - BTSession->decreaseDlTorrentPriority(hash); - } - updateLists(); - } - - // pause selected items in the list - void GUI::on_actionPause_triggered() { - bool inDownloadList = true; - if(tabs->currentIndex() > 1) return; - if(tabs->currentIndex() == 1) - inDownloadList = false; - QStringList hashes; - if(inDownloadList) { - hashes = downloadingTorrentTab->getSelectedTorrents(); - } else { - hashes = finishedTorrentTab->getSelectedTorrents(); - } - qDebug("nb hashes: %d", hashes.size()); - foreach(const QString &hash, hashes) { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(!h.is_paused()){ - h.pause(); - pausedTorrent(h); - if(inDownloadList) { - updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); - } else { - updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); - } +} + +// Resume All Downloads in DL list +void GUI::on_actionStart_All_triggered() { + bool change = false; + std::vector torrents = BTSession->getTorrents(); + std::vector::iterator torrentIT; + for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { + QTorrentHandle h = QTorrentHandle(*torrentIT); + if(!h.is_valid() || !h.is_paused()) continue; + change = true; + h.resume(); + resumedTorrent(h); + } + if(change) { + updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); + updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); + } +} + +// start selected items in the list +void GUI::on_actionStart_triggered() { + bool inDownloadList = true; + if(tabs->currentIndex() > 1) return; + if(tabs->currentIndex() == 1) + inDownloadList = false; + QStringList hashes; + if(inDownloadList) { + hashes = downloadingTorrentTab->getSelectedTorrents(); + } else { + hashes = finishedTorrentTab->getSelectedTorrents(); + } + foreach(const QString &hash, hashes) { + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(h.is_paused()){ + h.resume(); + resumedTorrent(h); + if(inDownloadList) { + updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); + } else { + updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); } } } - - // Resume All Downloads in DL list - void GUI::on_actionStart_All_triggered() { - bool change = false; +} + +void GUI::addUnauthenticatedTracker(QPair tracker) { + // Trackers whose authentication was cancelled + if(unauthenticated_trackers.indexOf(tracker) < 0) { + unauthenticated_trackers << tracker; + } +} + +// display properties of selected items +void GUI::on_actionTorrent_Properties_triggered() { + if(tabs->currentIndex() > 1) return; + switch(tabs->currentIndex()){ + case 1: // DL List + finishedTorrentTab->propertiesSelection(); + break; + default: + downloadingTorrentTab->propertiesSelection(); + } +} + +void GUI::updateLists(bool force) { + if(isVisible() || force) { + // update global informations + dlSpeedLbl->setText(tr("DL: %1 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1)))); + upSpeedLbl->setText(tr("UP: %1 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1)))); std::vector torrents = BTSession->getTorrents(); std::vector::iterator torrentIT; for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { QTorrentHandle h = QTorrentHandle(*torrentIT); - if(!h.is_valid() || !h.is_paused()) continue; - change = true; - h.resume(); - resumedTorrent(h); - } - if(change) { - updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); - updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); - } - } - - // start selected items in the list - void GUI::on_actionStart_triggered() { - bool inDownloadList = true; - if(tabs->currentIndex() > 1) return; - if(tabs->currentIndex() == 1) - inDownloadList = false; - QStringList hashes; - if(inDownloadList) { - hashes = downloadingTorrentTab->getSelectedTorrents(); - } else { - hashes = finishedTorrentTab->getSelectedTorrents(); - } - foreach(const QString &hash, hashes) { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(h.is_paused()){ - h.resume(); - resumedTorrent(h); - if(inDownloadList) { - updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); + if(!h.is_valid()) continue; + try { + if(h.is_seed()) { + // Update in finished list + finishedTorrentTab->updateTorrent(h); } else { - updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); - } - } - } - } - - void GUI::addUnauthenticatedTracker(QPair tracker) { - // Trackers whose authentication was cancelled - if(unauthenticated_trackers.indexOf(tracker) < 0) { - unauthenticated_trackers << tracker; - } - } - - // display properties of selected items - void GUI::on_actionTorrent_Properties_triggered() { - if(tabs->currentIndex() > 1) return; - switch(tabs->currentIndex()){ - case 1: // DL List - finishedTorrentTab->propertiesSelection(); - break; - default: - downloadingTorrentTab->propertiesSelection(); - } - } - - void GUI::updateLists(bool force) { - if(isVisible() || force) { - // update global informations - dlSpeedLbl->setText(tr("DL: %1 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1)))); - upSpeedLbl->setText(tr("UP: %1 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1)))); - std::vector torrents = BTSession->getTorrents(); - std::vector::iterator torrentIT; - for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { - QTorrentHandle h = QTorrentHandle(*torrentIT); - if(!h.is_valid()) continue; - try { - if(h.is_seed()) { - // Update in finished list - finishedTorrentTab->updateTorrent(h); - } else { - // Update in download list - if(downloadingTorrentTab->updateTorrent(h)) { - // Torrent was added, we may need to remove it from finished tab - finishedTorrentTab->deleteTorrent(h.hash()); - TorrentPersistentData::saveSeedStatus(h); - } + // Update in download list + if(downloadingTorrentTab->updateTorrent(h)) { + // Torrent was added, we may need to remove it from finished tab + finishedTorrentTab->deleteTorrent(h.hash()); + TorrentPersistentData::saveSeedStatus(h); } - } catch(invalid_handle e) { - qDebug("Caught Invalid handle exception, lucky us."); } + } catch(invalid_handle e) { + qDebug("Caught Invalid handle exception, lucky us."); } } - if(displaySpeedInTitle) { - QString dl_rate = QByteArray::number(BTSession->getSessionStatus().payload_download_rate/1024, 'f', 1); - QString up_rate = QByteArray::number(BTSession->getSessionStatus().payload_upload_rate/1024, 'f', 1); - setWindowTitle(tr("qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s)", "%1 is qBittorrent version").arg(QString::fromUtf8(VERSION)).arg(dl_rate).arg(up_rate)); - } } - - // Called when a tracker requires authentication - void GUI::trackerAuthenticationRequired(QTorrentHandle& h) { - if(unauthenticated_trackers.indexOf(QPair(h, h.current_tracker())) < 0) { - // Tracker login - new trackerLogin(this, h); - } + if(displaySpeedInTitle) { + QString dl_rate = QByteArray::number(BTSession->getSessionStatus().payload_download_rate/1024, 'f', 1); + QString up_rate = QByteArray::number(BTSession->getSessionStatus().payload_upload_rate/1024, 'f', 1); + setWindowTitle(tr("qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s)", "%1 is qBittorrent version").arg(QString::fromUtf8(VERSION)).arg(dl_rate).arg(up_rate)); } - - // Check connection status and display right icon - void GUI::checkConnectionStatus() { - // qDebug("Checking connection status"); - // Update Ratio - updateRatio(); - // update global informations - if(systrayIntegration) { +} + +// Called when a tracker requires authentication +void GUI::trackerAuthenticationRequired(QTorrentHandle& h) { + if(unauthenticated_trackers.indexOf(QPair(h, h.current_tracker())) < 0) { + // Tracker login + new trackerLogin(this, h); + } +} + +// Check connection status and display right icon +void GUI::checkConnectionStatus() { + // qDebug("Checking connection status"); + // Update Ratio + updateRatio(); + // update global informations + if(systrayIntegration) { #ifdef Q_WS_WIN - // Windows does not support html here - QString html =tr("DL speed: %1 KiB/s", "e.g: Download speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1))); - html += "\n"; - html += tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1))); + // Windows does not support html here + QString html =tr("DL speed: %1 KiB/s", "e.g: Download speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1))); + html += "\n"; + html += tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1))); #else - QString html = "
"; - html += tr("qBittorrent"); - html += "
"; - html += "
"; - html += " "+tr("DL speed: %1 KiB/s", "e.g: Download speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1))); - html += "
"; - html += "
"; - html += " "+tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1))); - html += "
"; + QString html = "
"; + html += tr("qBittorrent"); + html += "
"; + html += "
"; + html += " "+tr("DL speed: %1 KiB/s", "e.g: Download speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1))); + html += "
"; + html += "
"; + html += " "+tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1))); + html += "
"; #endif - myTrayIcon->setToolTip(html); // tray icon - } - session_status sessionStatus = BTSession->getSessionStatus(); - if(sessionStatus.has_incoming_connections) { - // Connection OK - connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/connected.png"))); - connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection Status:")+QString::fromUtf8("
")+tr("Online")); - }else{ - connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png"))); - connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection status:")+QString::fromUtf8("
")+QString::fromUtf8("")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("")); - } + myTrayIcon->setToolTip(html); // tray icon } - - /***************************************************** + session_status sessionStatus = BTSession->getSessionStatus(); + if(sessionStatus.has_incoming_connections) { + // Connection OK + connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/connected.png"))); + connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection Status:")+QString::fromUtf8("
")+tr("Online")); + }else{ + connecStatusLblIcon->setPixmap(QPixmap(QString::fromUtf8(":/Icons/skin/firewalled.png"))); + connecStatusLblIcon->setToolTip(QString::fromUtf8("")+tr("Connection status:")+QString::fromUtf8("
")+QString::fromUtf8("")+tr("No direct connections. This may indicate network configuration problems.")+QString::fromUtf8("")); + } +} + +/***************************************************** * * * Utils * * * *****************************************************/ - - void GUI::downloadFromURLList(const QStringList& url_list) { - foreach(const QString url, url_list) { - if(url.startsWith("magnet:", Qt::CaseInsensitive)) { - BTSession->addMagnetUri(url); - } else { - BTSession->downloadFromUrl(url); - } + +void GUI::downloadFromURLList(const QStringList& url_list) { + foreach(const QString url, url_list) { + if(url.startsWith("magnet:", Qt::CaseInsensitive)) { + BTSession->addMagnetUri(url); + } else { + BTSession->downloadFromUrl(url); } } - - /***************************************************** +} + +/***************************************************** * * * Options * * * *****************************************************/ - - void GUI::createSystrayDelayed() { - static int timeout = 10; - if(QSystemTrayIcon::isSystemTrayAvailable()) { - // Ok, systray integration is now supported - // Create systray icon - createTrayIcon(); - systrayIntegration = true; - delete systrayCreator; + +void GUI::createSystrayDelayed() { + static int timeout = 10; + if(QSystemTrayIcon::isSystemTrayAvailable()) { + // Ok, systray integration is now supported + // Create systray icon + createTrayIcon(); + systrayIntegration = true; + delete systrayCreator; + } else { + if(timeout) { + // Retry a bit later + systrayCreator->start(1000); + --timeout; } else { - if(timeout) { - // Retry a bit later - systrayCreator->start(1000); - --timeout; - } else { - // Timed out, apparently system really does not - // support systray icon - delete systrayCreator; - } + // Timed out, apparently system really does not + // support systray icon + delete systrayCreator; } } - - void GUI::createTrayIcon() { - // Tray icon +} + +void GUI::createTrayIcon() { + // Tray icon #ifdef Q_WS_WIN - myTrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent16.png")), this); + myTrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent16.png")), this); #endif #ifndef Q_WS_WIN - myTrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent22.png")), this); + myTrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent22.png")), this); #endif - // Tray icon Menu - myTrayIconMenu = new QMenu(this); - myTrayIconMenu->addAction(actionOpen); - myTrayIconMenu->addAction(actionDownload_from_URL); - myTrayIconMenu->addSeparator(); - myTrayIconMenu->addAction(actionSet_global_download_limit); - myTrayIconMenu->addAction(actionSet_global_upload_limit); - myTrayIconMenu->addSeparator(); - myTrayIconMenu->addAction(actionStart_All); - myTrayIconMenu->addAction(actionPause_All); - myTrayIconMenu->addSeparator(); - myTrayIconMenu->addAction(actionExit); - myTrayIcon->setContextMenu(myTrayIconMenu); - connect(myTrayIcon, SIGNAL(messageClicked()), this, SLOT(balloonClicked())); - // End of Icon Menu - connect(myTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleVisibility(QSystemTrayIcon::ActivationReason))); - myTrayIcon->show(); - } - - // Display Program Options - void GUI::on_actionOptions_triggered() { - options = new options_imp(this); - connect(options, SIGNAL(status_changed(bool)), this, SLOT(OptionsSaved(bool))); - options->show(); - } - - // Is executed each time options are saved - void GUI::OptionsSaved(bool deleteOptions) { - BTSession->addConsoleMessage(tr("Options were saved successfully.")); - bool newSystrayIntegration = options->systrayIntegration(); - if(newSystrayIntegration != systrayIntegration) { - if(newSystrayIntegration) { - // create the trayicon - createTrayIcon(); - } else { - // Destroy trayicon - delete myTrayIcon; - delete myTrayIconMenu; - } - systrayIntegration = newSystrayIntegration; - } - // Update Web UI - if (options->isWebUiEnabled()) { - quint16 port = options->webUiPort(); - QString username = options->webUiUsername(); - QString password = options->webUiPassword(); - initWebUi(username, password, port); - } else if(httpServer) { - delete httpServer; + // Tray icon Menu + myTrayIconMenu = new QMenu(this); + myTrayIconMenu->addAction(actionOpen); + myTrayIconMenu->addAction(actionDownload_from_URL); + myTrayIconMenu->addSeparator(); + myTrayIconMenu->addAction(actionSet_global_download_limit); + myTrayIconMenu->addAction(actionSet_global_upload_limit); + myTrayIconMenu->addSeparator(); + myTrayIconMenu->addAction(actionStart_All); + myTrayIconMenu->addAction(actionPause_All); + myTrayIconMenu->addSeparator(); + myTrayIconMenu->addAction(actionExit); + myTrayIcon->setContextMenu(myTrayIconMenu); + connect(myTrayIcon, SIGNAL(messageClicked()), this, SLOT(balloonClicked())); + // End of Icon Menu + connect(myTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleVisibility(QSystemTrayIcon::ActivationReason))); + myTrayIcon->show(); +} + +// Display Program Options +void GUI::on_actionOptions_triggered() { + options = new options_imp(this); + connect(options, SIGNAL(status_changed(bool)), this, SLOT(OptionsSaved(bool))); + options->show(); +} + +// Is executed each time options are saved +void GUI::OptionsSaved(bool deleteOptions) { + BTSession->addConsoleMessage(tr("Options were saved successfully.")); + bool newSystrayIntegration = options->systrayIntegration(); + if(newSystrayIntegration != systrayIntegration) { + if(newSystrayIntegration) { + // create the trayicon + createTrayIcon(); + } else { + // Destroy trayicon + delete myTrayIcon; + delete myTrayIconMenu; } - // Update session - configureSession(deleteOptions); + systrayIntegration = newSystrayIntegration; } - - bool GUI::initWebUi(QString username, QString password, int port) { - if(httpServer) - httpServer->close(); - else - httpServer = new HttpServer(BTSession, 3000, this); - httpServer->setAuthorization(username, password); - bool success = httpServer->listen(QHostAddress::Any, port); - if (success) - qDebug("Web UI listening on port %d", port); - else - QMessageBox::critical(this, "Web User Interface Error", "Unable to initialize HTTP Server on port " + misc::toQString(port)); - return success; + // Update Web UI + if (options->isWebUiEnabled()) { + quint16 port = options->webUiPort(); + QString username = options->webUiUsername(); + QString password = options->webUiPassword(); + initWebUi(username, password, port); + } else if(httpServer) { + delete httpServer; } - - /***************************************************** + // Update session + configureSession(deleteOptions); +} + +bool GUI::initWebUi(QString username, QString password, int port) { + if(httpServer) + httpServer->close(); + else + httpServer = new HttpServer(BTSession, 3000, this); + httpServer->setAuthorization(username, password); + bool success = httpServer->listen(QHostAddress::Any, port); + if (success) + qDebug("Web UI listening on port %d", port); + else + QMessageBox::critical(this, "Web User Interface Error", "Unable to initialize HTTP Server on port " + misc::toQString(port)); + return success; +} + +/***************************************************** * * * HTTP Downloader * * * *****************************************************/ - - // Display an input dialog to prompt user for - // an url - void GUI::on_actionDownload_from_URL_triggered() { - downloadFromURL *downloadFromURLDialog = new downloadFromURL(this); - connect(downloadFromURLDialog, SIGNAL(urlsReadyToBeDownloaded(const QStringList&)), BTSession, SLOT(downloadFromURLList(const QStringList&))); - } - + +// Display an input dialog to prompt user for +// an url +void GUI::on_actionDownload_from_URL_triggered() { + downloadFromURL *downloadFromURLDialog = new downloadFromURL(this); + connect(downloadFromURLDialog, SIGNAL(urlsReadyToBeDownloaded(const QStringList&)), BTSession, SLOT(downloadFromURLList(const QStringList&))); +} + diff --git a/src/GUI.h b/src/GUI.h index 3c81d2b06..1c789f7fc 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -44,13 +44,8 @@ class DownloadingTorrents; class FinishedTorrents; class downloadFromURL; class SearchEngine; -#ifdef QT_4_4 - class QLocalServer; - class QLocalSocket; -#else - class QTcpServer; - class QTcpSocket; -#endif +class QLocalServer; +class QLocalSocket; class QCloseEvent; class RSSImp; class QShortcut; @@ -109,13 +104,8 @@ class GUI : public QMainWindow, private Ui::MainWindow{ // Web UI QPointer httpServer; // Misc -#ifdef QT_4_4 QLocalServer *localServer; QLocalSocket *clientConnection; -#else - QTcpServer *localServer; - QTcpSocket *clientConnection; -#endif protected slots: // GUI related slots diff --git a/src/about_imp.h b/src/about_imp.h index 190688094..67120768b 100644 --- a/src/about_imp.h +++ b/src/about_imp.h @@ -52,10 +52,10 @@ class about : public QDialog, private Ui::AboutDlg{ lb_name->setText(QString::fromUtf8("

")+tr("qBittorrent")+QString::fromUtf8(" "VERSION"

")); // Thanks te_thanks->append(QString::fromUtf8("")); - te_thanks->append(QString::fromUtf8("
  • I would like to thank sourceforge.net for hosting qBittorrent project.
  • ")); - te_thanks->append(QString::fromUtf8("
  • I am happy that Ishan Arora and Arnaud Demaizière are contributing to the project as developers. Their help is greatly appreciated
  • ")); - te_thanks->append(QString::fromUtf8("
  • I also want to thank Jeffery Fernandez (jeffery@qbittorrent.org), project consultant, RPM packager, for his help and support.
  • ")); - te_thanks->append(QString::fromUtf8("
  • I am grateful to Peter Koeleman (peter@qbittorrent.org) who is helping port qBittorrent to Windows.
  • ")); + te_thanks->append(QString::fromUtf8("
    • I would first like to thank sourceforge.net for hosting qBittorrent project and for their support.
    • ")); + te_thanks->append(QString::fromUtf8("
    • I am pleased that people from all over the world are contributing to qBittorrent: Ishan Arora (India), Arnaud Demaizière (France) and Stephanos Antaris (Greece). Their help is greatly appreciated
    • ")); + te_thanks->append(QString::fromUtf8("
    • I also want to thank Jeffery Fernandez (jeffery@qbittorrent.org), project consultant, for his help and support since the beginning of this project.
    • ")); + te_thanks->append(QString::fromUtf8("
    • I am grateful to Peter Koeleman (peter@qbittorrent.org) for working on qBittorrent port to Windows.
    • ")); te_thanks->append(QString::fromUtf8("
    • Thanks a lot to our graphist Mateusz Toboła (tobejodok@qbittorrent.org) for his great work.


    ")); te_thanks->scrollToAnchor(QString::fromUtf8("top")); // Translation diff --git a/src/addTorrentDialog.ui b/src/addTorrentDialog.ui index 7f0004d21..7a6efd96a 100644 --- a/src/addTorrentDialog.ui +++ b/src/addTorrentDialog.ui @@ -207,6 +207,13 @@ + + + + Skip file checking and start seeding immediately + + + diff --git a/src/bittorrent.cpp b/src/bittorrent.cpp index 1afcb2a73..281de1b89 100644 --- a/src/bittorrent.cpp +++ b/src/bittorrent.cpp @@ -64,8 +64,8 @@ bittorrent::bittorrent() : DHTEnabled(false), preAllocateAll(false), addInPause( // Check if we should spoof utorrent QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); if(settings.value(QString::fromUtf8("Preferences/Bittorrent/AzureusSpoof"), false).toBool()) { - s = new session(fingerprint("UT", 1, 8, 4, 0), 0); - qDebug("Peer ID: %s", fingerprint("UT", 1, 8, 4, 0).to_string().c_str()); + s = new session(fingerprint("UT", 1, 8, 5, 0), 0); + qDebug("Peer ID: %s", fingerprint("UT", 1, 8, 5, 0).to_string().c_str()); } else { s = new session(fingerprint("qB", VERSION_MAJOR, VERSION_MINOR, VERSION_BUGFIX, 0), 0); qDebug("Peer ID: %s", fingerprint("qB", VERSION_MAJOR, VERSION_MINOR, VERSION_BUGFIX, 0).to_string().c_str()); @@ -581,6 +581,14 @@ QTorrentHandle bittorrent::addTorrent(QString path, bool fromScanDir, QString fr } else { p.save_path = defaultTempPath.toLocal8Bit().data(); } + + // Skip checking and directly start seeding (new in libtorrent v0.15) + if(TorrentTempData::isSeedingMode(hash)){ + p.seed_mode=true; + } else { + p.seed_mode=false; + } + // TODO: Remove in v1.6.0: For backward compatibility only if(QFile::exists(misc::qBittorrentPath()+"BT_backup"+QDir::separator()+hash+".finished")) { p.save_path = savePath.toLocal8Bit().data(); @@ -858,7 +866,8 @@ void bittorrent::loadFilesPriorities(QTorrentHandle &h) { qDebug("Setting file piority to %d", priority); v.push_back(priority); } - h.prioritize_files(v); + if(v.size() == (unsigned int)h.num_files()) + h.prioritize_files(v); } float bittorrent::getRealRatio(QString hash) const{ @@ -983,6 +992,12 @@ void bittorrent::scanDirectory(QString scan_dir) { FSMutex->lock(); qDebug("Scanning directory: %s", scan_dir.toLocal8Bit().data()); QDir dir(scan_dir); + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + // Check that scan dir is not BT_backup (silly but who knows...) + if(dir == torrentBackup) { + std::cerr << "Scan directory cannot be qBittorrent backup folder!" << std::endl; + return; + } QStringList filters; filters << "*.torrent"; QStringList files = dir.entryList(filters, QDir::Files, QDir::Unsorted); @@ -1522,14 +1537,31 @@ void bittorrent::applyEncryptionSettings(pe_settings se) { // backup directory void bittorrent::startUpTorrents() { qDebug("Resuming unfinished torrents"); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); QStringList fileNames; QStringList known_torrents = TorrentPersistentData::knownTorrents(); - if(known_torrents.empty()) { + + if(known_torrents.empty() && !settings.value("v1_4_x_torrent_imported", false).toBool()) { qDebug("No known torrent, importing old torrents"); importOldTorrents(); return; } + + // Safety measure because some people reported torrent loss since + // we switch the v1.5 way of resuming torrents on startup + QStringList filters; + filters << "*.torrent"; + QStringList torrents_on_hd = torrentBackup.entryList(filters, QDir::Files, QDir::Unsorted); + foreach(QString hash, torrents_on_hd) { + hash.chop(8); // remove trailing .torrent + if(!known_torrents.contains(hash)) { + std::cerr << "ERROR Detected!!! Adding back torrent " << hash.toLocal8Bit().data() << " which got lost for some reason." << std::endl; + addTorrent(torrentBackup.path()+QDir::separator()+hash+".torrent", false, QString(), true); + } + } + // End of safety measure + qDebug("Starting up torrents"); if(isQueueingEnabled()) { QList > hashes; @@ -1690,79 +1722,78 @@ void bittorrent::applyFormerAttributeFiles(QTorrentHandle h) { // TODO: Remove in qBittorrent v1.6.0 void bittorrent::importOldTorrents() { QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - if(!settings.value("v1_4_x_torrent_imported", false).toBool()) { - // Import old torrent - QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); - QStringList fileNames; - QStringList filters; - filters << "*.torrent"; - fileNames = torrentBackup.entryList(filters, QDir::Files, QDir::Unsorted); - if(isQueueingEnabled()) { - QList > filePaths; - foreach(const QString &fileName, fileNames) { - QString filePath = torrentBackup.path()+QDir::separator()+fileName; - int prio = 99999; - // Get priority - QString prioPath = filePath; - prioPath.replace(".torrent", ".prio"); - if(QFile::exists(prioPath)) { - QFile prio_file(prioPath); - if(prio_file.open(QIODevice::ReadOnly | QIODevice::Text)) { - bool ok = false; - prio = prio_file.readAll().toInt(&ok); - if(!ok) - prio = 99999; - prio_file.close(); - } + Q_ASSERT(!settings.value("v1_4_x_torrent_imported", false).toBool()); + // Import old torrent + QDir torrentBackup(misc::qBittorrentPath() + "BT_backup"); + QStringList fileNames; + QStringList filters; + filters << "*.torrent"; + fileNames = torrentBackup.entryList(filters, QDir::Files, QDir::Unsorted); + if(isQueueingEnabled()) { + QList > filePaths; + foreach(const QString &fileName, fileNames) { + QString filePath = torrentBackup.path()+QDir::separator()+fileName; + int prio = 99999; + // Get priority + QString prioPath = filePath; + prioPath.replace(".torrent", ".prio"); + if(QFile::exists(prioPath)) { + QFile prio_file(prioPath); + if(prio_file.open(QIODevice::ReadOnly | QIODevice::Text)) { + bool ok = false; + prio = prio_file.readAll().toInt(&ok); + if(!ok) + prio = 99999; + prio_file.close(); } - misc::insertSort2(filePaths, qMakePair(prio, filePath)); } - // Resume downloads - QPair fileName; - foreach(fileName, filePaths) { - importOldTempData(fileName.second); - QTorrentHandle h = addTorrent(fileName.second, false, QString(), true); - // Sequential download - if(TorrentTempData::hasTempData(h.hash())) { - qDebug("addTorrent: Setting download as sequential (from tmp data)"); - h.set_sequential_download(TorrentTempData::isSequential(h.hash())); - } - applyFormerAttributeFiles(h); - QString savePath = TorrentTempData::getSavePath(h.hash()); - // Save persistent data for new torrent - TorrentPersistentData::saveTorrentPersistentData(h); - // Save save_path - if(!defaultTempPath.isEmpty() && !savePath.isNull()) { - qDebug("addTorrent: Saving save_path in persistent data: %s", savePath.toLocal8Bit().data()); - TorrentPersistentData::saveSavePath(h.hash(), savePath); - } + misc::insertSort2(filePaths, qMakePair(prio, filePath)); + } + // Resume downloads + QPair fileName; + foreach(fileName, filePaths) { + importOldTempData(fileName.second); + QTorrentHandle h = addTorrent(fileName.second, false, QString(), true); + // Sequential download + if(TorrentTempData::hasTempData(h.hash())) { + qDebug("addTorrent: Setting download as sequential (from tmp data)"); + h.set_sequential_download(TorrentTempData::isSequential(h.hash())); } - } else { - QStringList filePaths; - foreach(const QString &fileName, fileNames) { - filePaths.append(torrentBackup.path()+QDir::separator()+fileName); + applyFormerAttributeFiles(h); + QString savePath = TorrentTempData::getSavePath(h.hash()); + // Save persistent data for new torrent + TorrentPersistentData::saveTorrentPersistentData(h); + // Save save_path + if(!defaultTempPath.isEmpty() && !savePath.isNull()) { + qDebug("addTorrent: Saving save_path in persistent data: %s", savePath.toLocal8Bit().data()); + TorrentPersistentData::saveSavePath(h.hash(), savePath); } - // Resume downloads - foreach(const QString &fileName, filePaths) { - importOldTempData(fileName); - QTorrentHandle h = addTorrent(fileName, false, QString(), true); - // Sequential download - if(TorrentTempData::hasTempData(h.hash())) { - qDebug("addTorrent: Setting download as sequential (from tmp data)"); - h.set_sequential_download(TorrentTempData::isSequential(h.hash())); - } - applyFormerAttributeFiles(h); - QString savePath = TorrentTempData::getSavePath(h.hash()); - // Save persistent data for new torrent - TorrentPersistentData::saveTorrentPersistentData(h); - // Save save_path - if(!defaultTempPath.isEmpty() && !savePath.isNull()) { - qDebug("addTorrent: Saving save_path in persistent data: %s", savePath.toLocal8Bit().data()); - TorrentPersistentData::saveSavePath(h.hash(), savePath); - } + } + } else { + QStringList filePaths; + foreach(const QString &fileName, fileNames) { + filePaths.append(torrentBackup.path()+QDir::separator()+fileName); + } + // Resume downloads + foreach(const QString &fileName, filePaths) { + importOldTempData(fileName); + QTorrentHandle h = addTorrent(fileName, false, QString(), true); + // Sequential download + if(TorrentTempData::hasTempData(h.hash())) { + qDebug("addTorrent: Setting download as sequential (from tmp data)"); + h.set_sequential_download(TorrentTempData::isSequential(h.hash())); + } + applyFormerAttributeFiles(h); + QString savePath = TorrentTempData::getSavePath(h.hash()); + // Save persistent data for new torrent + TorrentPersistentData::saveTorrentPersistentData(h); + // Save save_path + if(!defaultTempPath.isEmpty() && !savePath.isNull()) { + qDebug("addTorrent: Saving save_path in persistent data: %s", savePath.toLocal8Bit().data()); + TorrentPersistentData::saveSavePath(h.hash(), savePath); } } - settings.setValue("v1_4_x_torrent_imported", true); - std::cout << "Successfully imported torrents from v1.4.x (or previous) instance" << std::endl; } + settings.setValue("v1_4_x_torrent_imported", true); + std::cout << "Successfully imported torrents from v1.4.x (or previous) instance" << std::endl; } diff --git a/src/downloadThread.cpp b/src/downloadThread.cpp index 2f90c74a4..2c83dbd8a 100644 --- a/src/downloadThread.cpp +++ b/src/downloadThread.cpp @@ -29,215 +29,140 @@ */ #include "downloadThread.h" -#include +#include #include -#include +#include +#include +#include -#define MAX_THREADS 3 +/** Download Thread **/ -// http://curl.rtin.bz/libcurl/c/libcurl-errors.html -QString subDownloadThread::errorCodeToString(CURLcode status) { - switch(status){ - case CURLE_FTP_CANT_GET_HOST: - case CURLE_COULDNT_RESOLVE_HOST: - return tr("Host is unreachable"); - case CURLE_READ_ERROR: - case CURLE_FILE_COULDNT_READ_FILE: - return tr("File was not found (404)"); - case CURLE_FTP_ACCESS_DENIED: - case CURLE_LOGIN_DENIED: - case CURLE_FTP_USER_PASSWORD_INCORRECT: - return tr("Connection was denied"); - case CURLE_URL_MALFORMAT: - return tr("Url is invalid"); - case CURLE_COULDNT_RESOLVE_PROXY: - return tr("Could not resolve proxy"); - //case 5: - // return tr("Connection forbidden (403)"); - //case 6: - // return tr("Connection was not authorized (401)"); - //case 7: - // return tr("Content has moved (301)"); - case CURLE_COULDNT_CONNECT: - return tr("Connection failure"); - case CURLE_OPERATION_TIMEOUTED: - return tr("Connection was timed out"); - case CURLE_INTERFACE_FAILED: - return tr("Incorrect network interface"); - default: - return tr("Unknown error"); - } +downloadThread::downloadThread(QObject* parent) : QObject(parent) { + networkManager = new QNetworkAccessManager(this); + connect(networkManager, SIGNAL(finished (QNetworkReply*)), this, SLOT(processDlFinished(QNetworkReply*))); } -subDownloadThread::subDownloadThread(QObject *parent, QString url) : QThread(parent), url(url), abort(false){} - -subDownloadThread::~subDownloadThread(){ - abort = true; - wait(); +downloadThread::~downloadThread(){ + delete networkManager; } -void subDownloadThread::run(){ - // Get a unique filename - QString filePath; - QTemporaryFile tmpfile; - tmpfile.setAutoRemove(false); - if (tmpfile.open()) { - filePath = tmpfile.fileName(); - qDebug("Temporary filename is: %s", filePath.toLocal8Bit().data()); +void downloadThread::processDlFinished(QNetworkReply* reply) { + QString url = reply->url().toString(); + if(reply->error() != QNetworkReply::NoError) { + // Failure + emit downloadFailure(url, errorCodeToString(reply->error())); } else { - emit downloadFailureST(this, url, tr("I/O Error")); - return; - } - tmpfile.close(); - // Now temporary file is created but closed so that - // curl can use it - FILE *f = fopen(filePath.toLocal8Bit().data(), "wb"); - if(!f) { - std::cerr << "couldn't open destination file" << "\n"; - return; - } - CURL *curl; - CURLcode res = (CURLcode)-1; - curl = curl_easy_init(); - if(curl) { - std::string c_url = url.toLocal8Bit().data(); - curl_easy_setopt(curl, CURLOPT_URL, c_url.c_str()); - // SSL support - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); - curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); - // PROXY SUPPORT - QSettings settings("qBittorrent", "qBittorrent"); - int intValue = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxyType"), 0).toInt(); - if(intValue > 0) { - // Proxy enabled - 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(); - qDebug("Using proxy: %s", (IP+QString(":")+port).toLocal8Bit().data()); - curl_easy_setopt(curl, CURLOPT_PROXYPORT, (IP+QString(":")+port).toLocal8Bit().data()); - // Default proxy type is HTTP, we must change if it is SOCKS5 - if(intValue%2==0) { - qDebug("Proxy is SOCKS5, not HTTP"); - curl_easy_setopt(curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5); - } - // Authentication? - if(intValue > 2) { - qDebug("Proxy requires authentication, authenticating"); - QString username = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Username"), 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()); + // Success + QString filePath; + QTemporaryFile tmpfile; + tmpfile.setAutoRemove(false); + if (tmpfile.open()) { + filePath = tmpfile.fileName(); + qDebug("Temporary filename is: %s", filePath.toLocal8Bit().data()); + if(reply->open(QIODevice::ReadOnly)) { + tmpfile.write(reply->readAll()); + reply->close(); + tmpfile.close(); + // Send finished signal + emit downloadFinished(url, filePath); + } else { + // Error when reading the request + tmpfile.close(); + emit downloadFailure(url, tr("I/O Error")); } - } - // We have to define CURLOPT_WRITEFUNCTION or it will crash on windows - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, f); - // Verbose - //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); - // No progress info (we don't use it) - curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1); - // Redirections - curl_easy_setopt(curl, CURLOPT_AUTOREFERER, 1); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); - curl_easy_setopt(curl, CURLOPT_MAXREDIRS, -1); - qDebug("Downloading %s", url.toLocal8Bit().data()); - if(!abort) - res = curl_easy_perform(curl); - qDebug("done downloading %s", url.toLocal8Bit().data()); - /* always cleanup */ - curl_easy_cleanup(curl); - fclose(f); - if(abort) - return; - if(res) { - emit downloadFailureST(this, url, errorCodeToString(res)); } else { - emit downloadFinishedST(this, url, filePath); + emit downloadFailure(url, tr("I/O Error")); } - qDebug("%s Raised the signal", url.toLocal8Bit().data()); - } else { - std::cerr << "Could not initialize CURL" << "\n"; } -} - -/** Download Thread **/ - -downloadThread::downloadThread(QObject* parent) : QThread(parent), abort(false){} - -downloadThread::~downloadThread(){ - mutex.lock(); - abort = true; - condition.wakeOne(); - mutex.unlock(); - //qDebug("downloadThread deleting subthreads..."); - qDeleteAll(subThreads); - //qDebug("downloadThread deleted subthreads"); - wait(); + // Clean up + reply->deleteLater(); } void downloadThread::downloadUrl(QString url){ - QMutexLocker locker(&mutex); - urls_queue.enqueue(url); - if(!isRunning()){ - start(); - }else{ - condition.wakeOne(); - } + // Update proxy settings + applyProxySettings(); + // Process download request + networkManager->get(QNetworkRequest(QUrl(url))); } -void downloadThread::run(){ - forever{ - if(abort) { - qDebug("DownloadThread aborting..."); - return; +void downloadThread::applyProxySettings() { + QNetworkProxy proxy; + QSettings settings("qBittorrent", "qBittorrent"); + int intValue = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxyType"), 0).toInt(); + if(intValue > 0) { + // Proxy enabled + QString IP = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/IP"), "0.0.0.0").toString(); + proxy.setHostName(IP); + QString port = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Port"), 8080).toString(); + qDebug("Using proxy: %s", (IP+QString(":")+port).toLocal8Bit().data()); + proxy.setPort(port.toUShort()); + // Default proxy type is HTTP, we must change if it is SOCKS5 + if(intValue%2==0) { + qDebug("Proxy is SOCKS5, not HTTP"); + proxy.setType(QNetworkProxy::Socks5Proxy); + } else { + proxy.setType(QNetworkProxy::HttpProxy); } - mutex.lock(); - if(!urls_queue.empty() && subThreads.size() < MAX_THREADS){ - QString url = urls_queue.dequeue(); - mutex.unlock(); - //qDebug("DownloadThread downloading %s...", url.toLocal8Bit().data()); - subDownloadThread *st = new subDownloadThread(0, url); - subThreads << st; - 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))); - st->start(); - }else{ - //qDebug("DownloadThread sleeping..."); - condition.wait(&mutex); - //qDebug("DownloadThread woke up"); - mutex.unlock(); + // Authentication? + if(intValue > 2) { + qDebug("Proxy requires authentication, authenticating"); + QString username = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Username"), QString()).toString(); + proxy.setUser(username); + QString password = settings.value(QString::fromUtf8("Preferences/Connection/HTTPProxy/Password"), QString()).toString(); + proxy.setPassword(password); } - } -} -void downloadThread::propagateDownloadedFile(subDownloadThread* st, QString url, QString path){ - qDebug("Downloading %s was successful", url.toLocal8Bit().data()); - mutex.lock(); - int index = subThreads.indexOf(st); - Q_ASSERT(index != -1); - subThreads.removeAt(index); - mutex.unlock(); - qDebug("Deleting subthread"); - delete st; - emit downloadFinished(url, path); - mutex.lock(); - if(!urls_queue.empty()) { - condition.wakeOne(); + } else { + proxy.setType(QNetworkProxy::NoProxy); } - mutex.unlock(); - qDebug("Out of propagateDownloadedFile"); + networkManager->setProxy(proxy); } -void downloadThread::propagateDownloadFailure(subDownloadThread* st, QString url, QString reason){ - qDebug("Downloading %s failed", url.toLocal8Bit().data()); - mutex.lock(); - int index = subThreads.indexOf(st); - Q_ASSERT(index != -1); - subThreads.removeAt(index); - mutex.unlock(); - delete st; - emit downloadFailure(url, reason); - mutex.lock(); - if(!urls_queue.empty()) { - condition.wakeOne(); +QString downloadThread::errorCodeToString(QNetworkReply::NetworkError status) { + switch(status){ + case QNetworkReply::HostNotFoundError: + return tr("The remote host name was not found (invalid hostname)"); + case QNetworkReply::OperationCanceledError: + return tr("The operation was canceled"); + case QNetworkReply::RemoteHostClosedError: + return tr("The remote server closed the connection prematurely, before the entire reply was received and processed"); + case QNetworkReply::TimeoutError: + return tr("The connection to the remote server timed out"); + case QNetworkReply::SslHandshakeFailedError: + return tr("SSL/TLS handshake failed"); + case QNetworkReply::ConnectionRefusedError: + return tr("The remote server refused the connection"); + case QNetworkReply::ProxyConnectionRefusedError: + return tr("The connection to the proxy server was refused"); + case QNetworkReply::ProxyConnectionClosedError: + return tr("The proxy server closed the connection prematurely"); + case QNetworkReply::ProxyNotFoundError: + return tr("The proxy host name was not found"); + case QNetworkReply::ProxyTimeoutError: + return tr("The connection to the proxy timed out or the proxy did not reply in time to the request sent"); + case QNetworkReply::ProxyAuthenticationRequiredError: + return tr("The proxy requires authentication in order to honour the request but did not accept any credentials offered"); + case QNetworkReply::ContentAccessDenied: + return tr("The access to the remote content was denied (401)"); + case QNetworkReply::ContentOperationNotPermittedError: + return tr("The operation requested on the remote content is not permitted"); + case QNetworkReply::ContentNotFoundError: + return tr("The remote content was not found at the server (404)"); + case QNetworkReply::AuthenticationRequiredError: + return tr("The remote server requires authentication to serve the content but the credentials provided were not accepted"); + case QNetworkReply::ProtocolUnknownError: + return tr("The Network Access API cannot honor the request because the protocol is not known"); + case QNetworkReply::ProtocolInvalidOperationError: + return tr("The requested operation is invalid for this protocol"); + case QNetworkReply::UnknownNetworkError: + return tr("An unknown network-related error was detected"); + case QNetworkReply::UnknownProxyError: + return tr("An unknown proxy-related error was detected"); + case QNetworkReply::UnknownContentError: + return tr("An unknown error related to the remote content was detected"); + case QNetworkReply::ProtocolFailure: + return tr("A breakdown in protocol was detected"); + default: + return tr("Unknown error"); } - mutex.unlock(); } diff --git a/src/downloadThread.h b/src/downloadThread.h index 8bdf58063..af5ee8abc 100644 --- a/src/downloadThread.h +++ b/src/downloadThread.h @@ -31,64 +31,34 @@ #ifndef DOWNLOADTHREAD_H #define DOWNLOADTHREAD_H -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include -class subDownloadThread : public QThread { - Q_OBJECT - private: - QString url; - bool abort; - - public: - subDownloadThread(QObject *parent, QString url); - ~subDownloadThread(); - QString errorCodeToString(CURLcode status); - - signals: - // For subthreads - void downloadFinishedST(subDownloadThread* st, QString url, QString file_path); - void downloadFailureST(subDownloadThread* st, QString url, QString reason); +class QNetworkAccessManager; - protected: - void run(); -}; - -class downloadThread : public QThread { +class downloadThread : public QObject { Q_OBJECT - private: - QQueue urls_queue; - QMutex mutex; - QWaitCondition condition; - bool abort; - QList subThreads; - - signals: - void downloadFinished(QString url, QString file_path); - void downloadFailure(QString url, QString reason); +private: + QNetworkAccessManager *networkManager; - public: - downloadThread(QObject* parent); +signals: + void downloadFinished(QString url, QString file_path); + void downloadFailure(QString url, QString reason); - ~downloadThread(); +public: + downloadThread(QObject* parent); + ~downloadThread(); + void downloadUrl(QString url); + //void setProxy(QString IP, int port, QString username, QString password); - void downloadUrl(QString url); - void setProxy(QString IP, int port, QString username, QString password); +protected: + QString errorCodeToString(QNetworkReply::NetworkError status); + void applyProxySettings(); - protected: - void run(); +protected slots: + void processDlFinished(QNetworkReply* reply); - protected slots: - void propagateDownloadedFile(subDownloadThread* st, QString url, QString path); - void propagateDownloadFailure(subDownloadThread* st, QString url, QString reason); }; #endif diff --git a/src/engineSelectDlg.cpp b/src/engineSelectDlg.cpp index 96590d1cf..584d90c71 100644 --- a/src/engineSelectDlg.cpp +++ b/src/engineSelectDlg.cpp @@ -41,6 +41,7 @@ #include #include #include +#include #ifdef HAVE_ZZIP #include diff --git a/src/lang/qbittorrent_bg.qm b/src/lang/qbittorrent_bg.qm index 32111091775599c0fd5abb85e3c75161b784eb20..9f16816d7f1ac5ecfd9479e8d498ded4e36deddd 100644 GIT binary patch delta 1852 zcmXZdc~q3;9tZI6yUoix!#l_b5>ql!;6Mvg+=Jl8T;l?YfK-A&j2sFQmoPQVyo{5P zc{B0~4~RFHQ!YqKhO(s|NKhn8)KI)u;zAgUEJk{}q1F9)-uu_*%0UsZ23)yB&IOv67C-I7Z7q(ra(@=T<}-T>5O)$N{4bEu0eme0&p+^S z;Kc_<0rLxiCst@?dIRYX-hTziC<2b$12RtlU&R);Tezm;p%DI(jZNe%zD`K9!srXp zn&;MN_HAd$oONb4q)#N^e1zsTf6ak1&D#edRg3{`QIM+k0QSE@*Fe!cN zYviV|Ke!3XO2oW740P19iF~YY6A}t3oOORi(nr}8YAcc|6yVln=Hye%wR)r!l>z99EF23_IV9sjppKJdBc6xIqTdBqgM>KE6vl*hFzTS)&vOA4tkx_pn0fKNL{-gaODW8)?8VtR73kkQuwv|nPXE>^iKY&IPME@d!>&W9^v`8qpykJafyLYrhUEt-;QIx40= z-wk~1C9W*^1-SUA=#ra&<0<00-B-v#aYJ$yH9vrP%eLS>;`Rm+sJ^55)2O(sawCwU zko(C@aaUC&(D(v-O`a5b*h{Q>YA?{+EH>$lz(Z@r<5`I`^hx5$w*rALg2YpcT7a5; zntd&-RSxI2vfpJJx1T-j<}-W0l=Dn9;5a8O9sCQBe~hHrj0}+Sj#5}H(bDpgPXVh- zdTZI&G)z&Ft9Su*&`m0QI|q0wQ(FHJ4cV7F*@teEL+e7NZU5K`^i*l~w@OvQ`?OJo z(&6KD&8v}`hhsE*N7!AraOF$s+kyi?-!vAcgnORQnGCWGQLqVFoOXLa3aX@#NY`#g=Ilq{->%)CNkn<C5(w{ZUr2-}LO$AFZ_{`iW@BVcW@QSzmxgT9sFeX>? z45)iqu5nQMJy+$%x2d~R7RpzBegsl)$UokzqcKU8d(w{r?n~Hb1`Aiu+6{hu=TtUi zh~-*Yn7f@TWKMTm@H|CVb{eR4X?7K9j%-rQOYTr6?vFfzNmccW>xx$v zyng|RFlp8v(>yn(+0~{wa#2~%T?cG+N`61JwxvZ`z5XEZZjj=fz6S89WllB5d^AuQ z7CV95eVVmXH2dROmpaKbV$@Fv?V($S^+9cv>8W+h+c=rO5X};d3!b}a)gO$cF$wy= zB{TKaZTo>Abo%;Lbn0fdzM+06F#NH;vqujEKC188G>f`t)f~LfhK%9dC=2wk2CpzY z@(7*ji7*8D4**-o=u~S-F>(bDWRT;-0>Q?rpHL9pe^qj7gq}`ZEu!vP2EK5yc#y ze*D>3<|M8qu^pb4tXt~REdfBY4%B|Y{V)IwzsP#SiNkbCFp?W(5vd$dvyM0ISVwol>5eY*J;oO z7qibyHqY0MH3w**3_9bnX;jcJZm=O!2> delta 2777 zcmaKtc~nz(7RSFY`GxQTVTmG(3elqiDvJoRC?NZyxXgeeN2C;@q{c*nfI8N=QKya@ z{ARd*AoDufh$`8#aQ6ZD&l0|oLi}nvk+ez=P4X6o#&hs3nX6vR{k4Exk;BF z1E%)y2JrhHJ_Dw&1cv8J%yI%U==@bjVCGuj>(oamHT?oE-#i2bwWGt+zDf_Rp zATG%P&bRU!A=ER}g{pcSgRr_&KzKjI-QGp%y+GW3O8L?t#INcAZsu|)S%RwpDJv<_ z<>N7BdoEpd5mWYx!1u$sSvGBO#R*JXOIEejW4eAZ;GK-=AN+^vc1C(a3D9B3TVx*I zWk_H16VN^m8ReUScdkjSikA4ugp41SkSlYzk9@Lt05x70fiI$YiQH58lpmIR2s&OT z51#5EOl%koOjs!K$u(ia(jS3OoPZPsFzAqJM+Q!#04`DGs%$&toS!C^Speu~mF;~wbuQcGh z_hiL3)S?C-iO)Wht;mi9rqsw*m#?GVJ9CA?PsrjyimVxd@-e2RK;P@~@R>2dL~Dty z*X5CQNx+L!0-<>&o7_Hi`>j_#7!x|8iHUjs}Ni3f;TY}cU(pawieIV|AV zd3I=I8Sv1=&Zz7Fm!<4%_9WVjDeS_cp+NO*R;xb`RHR94o6pOX!9qN5RQd_&Ty5=~ zl&;YE#{rr33d7^kfcZ3$1~_7f!gz|(I@hUKu!(lX)1p{px=M2uqp+0D0=}(MtX!r8 zMrJ8WTxj0@I+4$_9usi9N%7Giw*t)>659(Dhve_m+Kp0tewM<_j*xh)OX9;FyumtH zoTs?4{)W*K!i zbdK__^8+CLp7OzeE9veZl+78Z0Nc6Bw&GYC)w{gJ#$!;f^~g>WJ($$i(L;^Eq!{by z{S$%pnG*lr#xL3=2nAei8!3*mKD~mLpyLitvGp4z6Royf0gn4fYz&k5yh(H%9SS^w z=r*?tIOZ>UuYHG#@!@5*ewG3;>7p|*I7Uo8Kx^qN893-8W*SuVOzjqDy?+Y` z(MUY5msnpevC%BCbC|e5Xaf8yMRPk1$@%%>!jdDvDlhTfaf<=_yx0AQT4%PtV?UPvXP-0s*-=Q9+dH$BFUqCa(?ofGMA}4G8c!PS3 z>}Drd+s%q@ZcrVGpfU9Fl(;EMb@b8!;G5&Bsv^3pMWd>&`UH6PT-DG_6%Ey@n%5^% zs~aRfox~5@1q(ZQi=C&p)@Hx}y5~Wwjn|+@fNP{pPzXJo+-htRMtnr8+|MStjH>v@ zIv!;2DNN;=_C=b;qc*ka&w);Z%@>(@BoxnE?0sb&tGSbdry%lh2WN4(nd7 zJwW+A_1Z*o>WNYP@%=A>#60yu+d?W##;`b>A2I4LD|BTP1Hx46nUKCZV>9hA}#fl5f zVfI=!kOi?A7R4foiG2O2{uWJ)$!OH&6zWYz?d)v5!JMyC(wp3|!2EWssn}>RW#^{m z0=jQO)@<_|3kqE7^Uk7EJ!&v-VLVuv$-Yq}g(^l^Gcp*Xuh zo2xVGb-6!_Sbj^z{WnxXNHdxuC$OO2$S%K%T&SO?%hj69g>R@}NRJ1UF=fccu^>quor`?Nd$DQz( zYOg3tg3!VXf$+D`!Mj(@C0=jPX?slS5u9x@8*{Z@f&PKsZ;%_phEmp1uQY=sS>Vs- zl3%tuyjP)5qN$)zt1r-+jnvefJh$w(4Xet()0<5HBx8;#KcA*gYt$7MoAT#s^~OS7{_O0WS8}p_ zbqe{23o&oKCLy<%2?dbISV|>ON(yPnhoM)}E-l~CQ@-9 GUI - + Open Torrent Files Отвори Торент Файлове @@ -1726,25 +1726,25 @@ Copyright © 2006 от Christophe Dumez<br> Сигурни ли сте че искате да изтриете всички файлове от списъка за сваляне? - - - - - + + + + + &Yes &Да - - - - - + + + + + &No &Не - + Are you sure you want to delete the selected item(s) in download list? Сигурни ли сте че искате да изтриете избраните файлове от списъка за сваляне? @@ -1761,7 +1761,7 @@ Copyright © 2006 от Christophe Dumez<br> kb/с - + Finished Завършен @@ -1806,7 +1806,7 @@ Copyright © 2006 от Christophe Dumez<br> Не мога да създам директория: - + Torrent Files Торент Файлове @@ -1866,16 +1866,16 @@ Copyright © 2006 от Christophe Dumez<br> qBittorrent - - + + qBittorrent qBittorrent - - - - + + + + Are you sure? -- qBittorrent Сигурни ли сте? -- qBittorrent @@ -2129,7 +2129,7 @@ Please close the other one first. Сигурни ли сте че искате да изтриете избраните файлове от списъка за сваляне и от твърдия диск? - + Download finished Свалянето завърши @@ -2143,15 +2143,15 @@ Please close the other one first. Търсачка - - + + qBittorrent %1 e.g: qBittorrent v0.x qBittorrent %1 - - + + Connection status: Състояние на връзката: @@ -2214,15 +2214,15 @@ Please close the other one first. qBittorrent %1 стартиран. - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s DL Скорост %1 KB/с - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s UL Скорост %1 KB/с @@ -2243,7 +2243,7 @@ Please close the other one first. Отложен - + Are you sure you want to quit? Сигурни ли сте че искате да напуснете? @@ -2306,14 +2306,14 @@ Please close the other one first. '%1' бе възстановен. - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. '%1' завърши свалянето. - + I/O Error i.e: Input/Output Error В/И Грешка @@ -2329,12 +2329,12 @@ Please close the other one first. Намерена грешка (пълен диск?), '%1' е в пауза. - + Connection Status: Състояние на връзката: - + Online Свързан @@ -2370,18 +2370,18 @@ Please close the other one first. Сваляне на '%1', моля изчакайте... - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. Намерена грешка (пълен диск?), '%1' е в пауза. - + Search Търси - + RSS RSS @@ -2395,13 +2395,13 @@ Please close the other one first. DHT поддръжка [ВКЛ], порт: %1 - - + + DHT support [OFF] DHT поддръжка [ИЗКЛ] - + PeX support [ON] PeX поддръжка [ВКЛ] @@ -2410,51 +2410,51 @@ Please close the other one first. PeX поддръжка [ИЗКЛ] - + The download list is not empty. Are you sure you want to quit qBittorrent? Листата за сваляне не е празна. Сигурни ли сте че искате да напуснете qBittorrent? - - + + Downloads Сваляне - + Are you sure you want to delete the selected item(s) in finished list? Сигурни ли сте че искате да изтриете избраните файлове от списъка на завършените сваляния? - + UPnP support [ON] UPnP поддръжка [ВКЛ] - + Encryption support [ON] Поддръжка кодиране [ВКЛ] - + Encryption support [FORCED] Поддръжка кодиране [ФОРСИРАНА] - + Encryption support [OFF] Поддръжка кодиране [ИЗКЛ] - + Alt+1 shortcut to switch to first tab Alt+1 - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -2463,34 +2463,34 @@ Are you sure you want to quit qBittorrent? Причина:%2 - + Alt+2 shortcut to switch to second tab Alt+2 - + Alt+4 shortcut to switch to fourth tab Alt+4 - + Url download error Грешка при сваляне от Url - + Couldn't download file at url: %1, reason: %2. Невъзможно сваляне на файл от url: %1, причина: %2. - + Are you sure you want to delete the selected item(s) from download list and from hard drive? Сигурни ли сте че искате да изтриете избраните от списъка за сваляне или от твърдия диск? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? Сигурни ли сте че искате да изтриете избраните от списъка на свалените или от твърдия диск? @@ -2500,50 +2500,50 @@ Are you sure you want to quit qBittorrent? '%1' бе премахнат завинаги. - + Alt+3 shortcut to switch to third tab Alt+3 - + Ctrl+F shortcut to switch to search tab Ctrl+F - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 qBittorrent се прехвърля на порт: TCP/%1 - + UPnP support [OFF] UPnP поддръжка [ИЗКЛ] - + NAT-PMP support [ON] NAT-PMP поддръжка [ВКЛ] - + NAT-PMP support [OFF] NAT-PMP поддръжка [ИЗКЛ] - + DHT support [ON], port: UDP/%1 DHT поддръжка [ВКЛ], порт: UDP/%1 - + Local Peer Discovery [ON] Търсене на локални връзки [ВКЛ] - + Local Peer Discovery support [OFF] Търсене на локални връзки [ИЗКЛ] @@ -2553,48 +2553,48 @@ Are you sure you want to quit qBittorrent? '%1' бе премахнат защото съотношението му надвишава определеното. - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) - - + + DL: %1 KiB/s DL: %1 KB/с - - + + UP: %1 KiB/s UP: %1 KB/с - - + + Ratio: %1 Съотношение: %1 - - + + DHT: %1 nodes DHT: %1 възли - - + + No direct connections. This may indicate network configuration problems. Няма директни връзки. Това може да е от проблеми в мрежовата настройка. - + Uploads Качени - + Options were saved successfully. Опциите бяха съхранени успешно. @@ -3318,12 +3318,12 @@ p, li { white-space: pre-wrap; } Програма за търсене - + Empty search pattern Празен образец за търсене - + Please type a search pattern first Моля първо въведете образец за търсене @@ -3336,13 +3336,13 @@ p, li { white-space: pre-wrap; } Трябва да изберете поне една търсачка. - - + + Results Резултати - + Searching... Търсене... @@ -3385,65 +3385,65 @@ Changelog: Вашата добавка за търсене е вече обновена. - + Cut Отрежи - + Copy Копирай - + Paste Залепи - + Clear field Изчисти полето - + Clear completion history Изчисти листа на завършените - + Search Engine Търсачка - - + + Search has finished Търсенето завърши - + An error occured during search... Намерена грешка при търсенето... - + Search aborted Търсенето е прекъснато - + Search returned no results Търсене завършено без резултат - + Results i.e: Search results Резултати - - + + Unknown Неизвестен @@ -3621,6 +3621,11 @@ Changelog: Download in sequential order (slower but good for previewing) Сваляне поред (по-бавно но удобно за преглед) + + + Skip file checking and start seeding immediately + + File name Име файл @@ -3638,17 +3643,17 @@ Changelog: Сваляне в правилен ред (по-бавен, но добър за оглед на файловете) - + Add to download list in paused state Добави в листа за сваляне в състояние на пауза - + Add Добави - + Cancel Прекъсни @@ -3665,22 +3670,22 @@ Changelog: Избери - + Ignored Игнорирано - + Normal Нормален - + High Висок - + Maximum Максимален @@ -3754,18 +3759,18 @@ Changelog: bittorrent - + %1 reached the maximum ratio you set. %1 използва максималното разрешено от вас отношение. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. '%1' бе премахнат завинаги. - + '%1' was removed. 'xxx.avi' was removed. '%1' бе премахнат. @@ -3781,96 +3786,96 @@ Changelog: '%1' бе възстановен. - + '%1' is not a valid magnet URI. '%1' е невалиден magnet URI. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. '%1' вече е в листа за сваляне. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) '%1' бе възстановен. (бързо възстановяване) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. '%1' добавен в листа за сваляне. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' Не мога да декодирам торент-файла: '%1' - + This file is either corrupted or this isn't a torrent. Този файла или е разрушен или не е торент. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked <font color='red'>%1</font> <i>бе блокиран от вашия IP филтър</i> - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned <font color='red'>%1</font> <i>бе прекъснат поради разрушени части</i> - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 Програмирано сваляне на файл %1 вмъкнато в торент %2 - + Unable to decode %1 torrent file. Не мога да декодирам %1 торент-файла. - + Couldn't listen on any of the given ports. Невъзможно изчакване от дадените портове. - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Грешка при следене на порт, съобщение: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Следене на порт успешно, съобщение: %1 - + Fast resume data was rejected for torrent %1, checking again... Бърза пауза бе отхвърлена за торент %1, нова проверка... - + Url seed lookup failed for url: %1, message: %2 Url споделяне провалено за url: %1, съобщение: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Сваляне на '%1', моля изчакайте... @@ -4203,6 +4208,125 @@ Changelog: Моля въведете поне един URL. + + downloadThread + + + + I/O Error + + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + Неизвестна грешка + + downloading @@ -4428,12 +4552,12 @@ Changelog: Грешно - + Uninstall warning Предупреждение за деинсталиране - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. @@ -4442,7 +4566,7 @@ However, those plugins were disabled. Обаче добавките бяха изключени. - + Uninstall success Успешно деинсталиране @@ -4451,62 +4575,62 @@ However, those plugins were disabled. Всички избрани добавки бяха успешно деинсталирани - + Select search plugins Избери добавки за търсене - - + + qBittorrent search plugins qBittorrent добавки за търсене - - - - - - - - + + + + + + + + Search plugin install Инсталиране на добавка за търсене - - - + + + Yes Да - - - - + + + + No Не - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine По-нова версия на %1 добавката за търсене вече е инсталирана. @@ -4522,17 +4646,17 @@ However, those plugins were disabled. %1 добавка на търсачката беше успешно инсталирана. - - - - - + + + + + Search plugin update Добавката за търсене е обновена - - + + Sorry, update server is temporarily unavailable. Съжалявам, сървъра за обновяване е временно недостъпен. @@ -4547,60 +4671,60 @@ However, those plugins were disabled. Съжалявам, %1 обновяването на добавката бе неуспешно. - + All your plugins are already up to date. Всички ваши добавки са вече обновени. - + All selected plugins were uninstalled successfully Всички избрани добавки бяха успешно деинсталирани - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine %1 добавка на търсачката не бе обновена, запазване на досегашната версия. - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine %1 добавка на търсачката не бе инсталирана. - + %1 search engine plugin was successfully updated. %1 is the name of the search engine %1 добавка на търсачката беше успешно обновена. - + %1 search engine plugin was successfully installed. %1 is the name of the search engine %1 добавка на търсачката беше успешно обновена. - + Search engine plugin archive could not be read. Файла за добавки на търсачката не бе прочетен. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine Съжалявам, инсталацията на %1 добавката за търсене бе неуспешна. - + New search engine plugin URL Нов URL за добавки на търсачката - + URL: URL: @@ -5502,29 +5626,24 @@ However, those plugins were disabled. subDownloadThread - Host is unreachable - Хоста е недостъпен + Хоста е недостъпен - File was not found (404) - Файла не е намерен (404) + Файла не е намерен (404) - Connection was denied - Връзката е отхвърлена + Връзката е отхвърлена - Url is invalid - Невалиден Url + Невалиден Url - I/O Error - В/И Грешка + В/И Грешка Connection forbidden (403) @@ -5539,29 +5658,24 @@ However, those plugins were disabled. Съдържанието бе преместено (301) - Connection failure - Неуспешна връзка + Неуспешна връзка - Connection was timed out - Връзката изтече + Връзката изтече - Incorrect network interface - Неточен интерфейс на мрежата + Неточен интерфейс на мрежата - Unknown error - Неизвестна грешка + Неизвестна грешка - Could not resolve proxy - Не намерено прокси + Не намерено прокси @@ -5627,12 +5741,12 @@ However, those plugins were disabled. Не мога да създам път за съхранение - + Invalid file selection Невалиден избор на файл - + You must select at least one file in the torrent Трябва да изберете поне един файл в торента diff --git a/src/lang/qbittorrent_ca.qm b/src/lang/qbittorrent_ca.qm index 746d05d6cd644f4adbb09102b0570f63681398f7..995ec3126f4cf5cca9efeb28cbffec16552a7c64 100644 GIT binary patch delta 827 zcmXBSZAep57zgnGz1!Wocc|#h;ZUZ6+g!fQId$`8l9kI!u+mJhk|wE?Qc_xpCibR? zXeUh&3oA>*q7<@1($K7+ERw_Qlk8WJHmtw6*M zW>h~jDXh(H2;B{#M*yOaGvl4iq~FYx1rp5FiABh3ZU>T_q?gm#YEjU46|m`0eXbk` zTgB6lXMotV_;&9wpoziis2wo>k?C%;j2`%UGsgWeV%OP4crhp#_tQQmk&ht0zP+{Y70|e!%XZXi@dI`U$Ay~fZ+W? z*X2&Y>j6`JkZBBICj4V2y%7dvjr6-5!r)jxtv<)pKV&ApR%o;7Tz<1m<0EE#CDWFz z$apaa#EdI4rd9ybATtL(SMrt-AY@b-kedZqYn0kW+IjR1@=m7leWGlBe+`I~DSNIg z0SOZMC3A>%VnlNpy*oit<+{Kn@j&AYePLr-{Fx~xa#C){X%&CS-87L(aoH74S7TcA z%+vz%o09iRHIRHqGQNtYp`ViSztDWcv!x@RK$_8nRB5DZBkPd5gIWNcMd}-&StZ7j z?{bZ~SQ>szmn=C>T4-_7iAtEZKI!Z1OIn>*;nsOt4Jz?;F|F=Htb$I=Qw0Sr&?#z3 zphFZ_a?cD zOm2*HD>MpsDUfz?=$T@(o=mAV#F4J{@pe^Il^?Ara_ucSQC#FAhXRa4x+qaSRGK~~ F{||GP;4uII delta 830 zcmXBST}YEr7zgnG`)=<$-*?Q^naiOp6}M?kn{&GPF)a&4O0d#wV6jp%O$9~#xJbja zG?Da_7Ghu}X-O9fg<)xkc4JnG7Iq>XDH9A~VTCs+6YeC0?oiKtrvvT(U_CA z=Pv`w`?B{&4Ujk}o8Lsy&>eE#XPR$#mV9A5kY>~@SDL*6MVH(g)D9SI^1v9)DsG+p zQtGTG`S~+CWQlfpr9FfGD3a-XBL7&NqSbjd9$cl>pq6S20rLl97Yx!Kbx_a>t&vLd z1(UB@J)O4>B$cXX@{53kyX3Zz!ii*ou3lufXw=89X&NOu&mobTPkuC@=m}csAgfU9NXg?PwFa$R8~`4&k_X0!bDat*knCxV*aTQn{z#WKl(-r(ndB Hx~%*UQpn#h diff --git a/src/lang/qbittorrent_ca.ts b/src/lang/qbittorrent_ca.ts index 462b51b37..7988bfa1c 100644 --- a/src/lang/qbittorrent_ca.ts +++ b/src/lang/qbittorrent_ca.ts @@ -1508,8 +1508,8 @@ p, li { white-space: pre-wrap; } iniciat. - - + + qBittorrent qBittorrent @@ -1526,12 +1526,12 @@ p, li { white-space: pre-wrap; } Vel. Pujada: - + Open Torrent Files Arxius Torrent oberts - + Torrent Files Arxius Torrent @@ -1569,10 +1569,10 @@ p, li { white-space: pre-wrap; } Aquest arxiu està corrupte o no es un arxiu torrent. - - - - + + + + Are you sure? -- qBittorrent Estàs segur? -- qBittorrent @@ -1581,20 +1581,20 @@ p, li { white-space: pre-wrap; } Estàs segur de que vols buidar la llista de descàrregues? - - - - - + + + + + &Yes &Yes - - - - - + + + + + &No &No @@ -1603,7 +1603,7 @@ p, li { white-space: pre-wrap; } Llista de descàrregues buidada. - + Are you sure you want to delete the selected item(s) in download list? Estàs segur de que vols esborrar les descàrregues seleccionades? @@ -1672,7 +1672,7 @@ p, li { white-space: pre-wrap; } /s - + Finished Finalitzat @@ -1944,7 +1944,7 @@ Si et plau tanca l'altre primer. Estàs segur que vols esborrar els objectes seleccionats de la llista de descàrregues i del disc dur? - + Download finished @@ -1958,15 +1958,15 @@ Si et plau tanca l'altre primer. Motor de Busqueda - - + + qBittorrent %1 e.g: qBittorrent v0.x - - + + Connection status: @@ -2011,15 +2011,15 @@ Si et plau tanca l'altre primer. Leechers - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s @@ -2035,7 +2035,7 @@ Si et plau tanca l'altre primer. Validant... - + Are you sure you want to quit? @@ -2050,25 +2050,25 @@ Si et plau tanca l'altre primer. Conectant... - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. - + I/O Error i.e: Input/Output Error I/O Error - + Connection Status: - + Online @@ -2078,115 +2078,115 @@ Si et plau tanca l'altre primer. Resultats - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. - + Search Cercar - + RSS - - + + DHT support [OFF] - + PeX support [ON] - + The download list is not empty. Are you sure you want to quit qBittorrent? - - + + Downloads Descarregues - + Are you sure you want to delete the selected item(s) in finished list? - + UPnP support [ON] - + Encryption support [ON] - + Encryption support [FORCED] - + Encryption support [OFF] - + Alt+1 shortcut to switch to first tab - + Alt+2 shortcut to switch to second tab - + Alt+4 shortcut to switch to fourth tab - + Url download error - + Couldn't download file at url: %1, reason: %2. - + Are you sure you want to delete the selected item(s) from download list and from hard drive? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? - + Alt+3 shortcut to switch to third tab - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -2194,90 +2194,90 @@ Are you sure you want to quit qBittorrent? - + Ctrl+F shortcut to switch to search tab - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 - + UPnP support [OFF] - + NAT-PMP support [ON] - + NAT-PMP support [OFF] - + DHT support [ON], port: UDP/%1 - + Local Peer Discovery [ON] - + Local Peer Discovery support [OFF] - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version - - + + DL: %1 KiB/s - - + + UP: %1 KiB/s - - + + Ratio: %1 - - + + DHT: %1 nodes - - + + No direct connections. This may indicate network configuration problems. - + Uploads - + Options were saved successfully. @@ -2932,12 +2932,12 @@ p, li { white-space: pre-wrap; } Motor per cercar - + Empty search pattern Busqueda pare buida - + Please type a search pattern first Si us plau introduïu una busqueda pare primer @@ -2946,13 +2946,13 @@ p, li { white-space: pre-wrap; } Has de seleccionar un motor de busqueda. - - + + Results Resultats - + Searching... Cercant... @@ -2987,65 +2987,65 @@ Log: El teu plugin de recerca torna a estar actualitzat. - + Cut - + Copy - + Paste - + Clear field - + Clear completion history - + Search Engine Motor de Busqueda - - + + Search has finished - + An error occured during search... Hi ha hagut un error durant la recerca... - + Search aborted Recerca abortada - + Search returned no results La recerca no ha tornat Resultats - + Results i.e: Search results Resultats - - + + Unknown Desconegut @@ -3215,6 +3215,11 @@ Log: Download in sequential order (slower but good for previewing) + + + Skip file checking and start seeding immediately + + File name Nom del fitxer @@ -3232,17 +3237,17 @@ Log: Descarrega en l'ordre correcte (més lent però més bona previsualització) - + Add to download list in paused state Afegeix a la llista de descàrregues en estat pausat - + Add Afegir - + Cancel Cancelar @@ -3255,22 +3260,22 @@ Log: Desseleccionat - + Ignored - + Normal - + High - + Maximum @@ -3340,113 +3345,113 @@ Log: bittorrent - + %1 reached the maximum ratio you set. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. - + '%1' was removed. 'xxx.avi' was removed. - + '%1' is not a valid magnet URI. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' - + This file is either corrupted or this isn't a torrent. Aquest arxiu està corrupte o no es un arxiu torrent. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 - + Unable to decode %1 torrent file. - + Couldn't listen on any of the given ports. No es pot obrir el port especificat. - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + Fast resume data was rejected for torrent %1, checking again... - + Url seed lookup failed for url: %1, message: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... @@ -3751,6 +3756,125 @@ Log: Si et plau entra mínimament una URL. + + downloadThread + + + + I/O Error + I/O Error + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + + + downloading @@ -3968,153 +4092,153 @@ Log: Fals - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. - + Uninstall success - + Select search plugins - - + + qBittorrent search plugins - - - - - - - - + + + + + + + + Search plugin install - - - + + + Yes - - - - + + + + No - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine - - - - - + + + + + Search plugin update - - + + Sorry, update server is temporarily unavailable. Ho sento, el servidor per actualitzar està temporalment no disponible. - + All your plugins are already up to date. - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine - + All selected plugins were uninstalled successfully - + %1 search engine plugin was successfully updated. %1 is the name of the search engine - + %1 search engine plugin was successfully installed. %1 is the name of the search engine - + Search engine plugin archive could not be read. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine - + New search engine plugin URL - + URL: @@ -4967,54 +5091,8 @@ However, those plugins were disabled. subDownloadThread - - Host is unreachable - - - - - File was not found (404) - - - - - Connection was denied - - - - - Url is invalid - - - - - Connection failure - - - - - Connection was timed out - - - - - Incorrect network interface - - - - - Unknown error - - - - I/O Error - I/O Error - - - - Could not resolve proxy - + I/O Error @@ -5080,12 +5158,12 @@ However, those plugins were disabled. No es pot creat la ruta guardada - + Invalid file selection Seleció invàlida de fitxer - + You must select at least one file in the torrent Has de seleccionar mínimament un fitxer en el torrent diff --git a/src/lang/qbittorrent_cs.qm b/src/lang/qbittorrent_cs.qm index 349269df15cc5140afc5257d322f224441c11bbf..17d187b44878e74f9d0b1264e2005c467337de47 100644 GIT binary patch delta 2023 zcmXBVc~BHr9tZGm_jFHB&oF}w0y-tku7+b!AhHX@1E@kd#6ZxMGmI&+kc32`3_BVl zpoSpp#exq^JXqI@1wSEu?pz`ceE7^tMCH+~ZD~Zz{!}3G zC1T2DVBAV9eEiHuh}%^PjCvqG{ZqhHi1@wFX`t!E${S5Lk+9<>{q-=CDoTL#NoK=3 z=GcFc^jkI!u9f&HqSc)mT<~ZCt{0Hq3U_Xj)GLf!6X{m?`!O z?yhHAKjc442?k;|@C6mSX&Ze`Tty%52#FQnNhAvY%v`|1MG=_1god$~Ic!n{cPsF=z<&OHtw2g?kxp+0uJ0<3ANdxBPi}^EXdtF*YcB=wRQ{sWYe+djUGDmNS zr!UjhY0H_X-I*gGR#kvpF5byL0gOZtFFC;On9>kU2jKgi%yE%eWTU)ax#Y?N;C3e| zljHcd81hWs#t-C>9JSl*{{%?-r<-U}UNVP2l^kOufk#Uv!w?PsRvKwh`y0N?l`M|5 z)_eLTi|_k%re$e;1A={adMY z^nd9<%J0%C7y9(q8Zt@Pp)}%jYb|UpRcAT71^nM-EhuVo)Ef$ z_b)Qf7?`7G(yevVPs~v}`VIoG>(m}sX*OGGh*sy%cP5ii-Rh9Rh3cB1Nx;LxEN)iU zUabNi%vCq6r>h3nsT&*q30ND|-GekDSAX?jVFYa(U*=<(4Cw;6hs4>|-E=@RYZhHI z5UBC^<2W$$Pa3~Bd;!BZn((;?=m;ljB9GI0KLlB8>&`tPrM4UFrZlYyKhvXUj^>8> z1K{yX;ylfpugxP-)7(6p!faN?6$0D7Wft9Mw(n>5-?B;ih`zDmH&Qn3J-#WMh<4HH z>o!_Rr2Wx1kC^RT_>LfwL+SM+Wp>7tr`k1pU!%Pgugxi;SJ~A*ZJvA#sPNPt?7s;_ zL~2ji{0;baSX(!o2zX!7Hn%MX?83BN84k3U1GM*yxxn6)+WUGskasl9#}@76HoAVW znz-t7)dLFM);`+$KV*@UdT;&NwYs_!w0@fDy7P-@wwrDftKOS`Vj<4tw;m>gqwz|~J4H;`P YQ&Lxb@Nrs7YMo=V>%ztnj$5MqKXlQTMgRZ+ delta 2884 zcmaKud010t7RKLulaSnm8%$hKst_GPunLNbyG%hAQK%aTRPYH9OKMCsA>axqF4a-1 zeroF|Q>{`F#SH}=D=x)#+)%0GRux4-#a-tatvUy9A6whU`Qzqyxyg6VdEaxs?{a94 zylA0(VUrd+0fYcYtbn37aLGvg6xcU@QAc;K-J&p`lvC4zh_%4qb^%e-fbMpQTkjGp zfIM0feTG8J1%@K|XlbZmE4bL9}Bj*9Ta)D7l0*7ubI^o3)SXA%N zpDSmrI8TplN1%x82J9@Ac;c?a+wLru^9k9p1B%rO;N&`qS0+iU^OX4bEEM0r01n=V zVj~qEY=ui1X*!<*VM;1+K*RQMJ-vE1p8?!$iC!oE3G@v?STz-U$P?i+?gN$GnaD@9 zXpQJRDlxYVga4ieB)q}k?*-t#j*aC~n5@Na1fn(~ZHv;4FT2;e6omFHBSf za2~9$VpM`g7G%o?ntICmjtnI^%OuvUmIa>}0E`|Yaoa>$SQ7o6c3k3CPg#66*_wS# z7XP&e@UM}wkq)Zu<0G<>wPnEZQ1(m_-sb!!*+M;y>bZK^vW9V7bwswZjz;*Cm9qR~ za_3G9mgLfpzch>Gy99LhmnVdg-aVD_#39wdw`RFx$`jzsI(d$=9N24;Pg`@D_)h9-MtoZU9;6{MN+Wv}d`_==d zffBcVEAiF@R;B7Lcq%HVY@jOlv8F#yllo&I*3>z96A0 zR^S?t^H*WOL3f}{V_|p^O{M1sA>sNGplGd-WKq*Od`d{3a~9|^SmJiQ#FOJCUJjA? zSP;f@*MNX3!C4mu>@N@|%-lqWG83lup)<*?LdbnX4&I$4%DR_%M3Tt4W-s>C3^@*ESj$ssqksWSfeh@q*XWS)Mcgr03KdaSKTB<-a+b{3nGD2MG_x$WX0O<+%Q(7 zZRgim)3PP4sotUSZG8u5(M8j(M&8;1m&XU}+bWY8o z_{YHG2+i@NbjtG=R^#T+*V|dsMm~I5IqTcVU8i>)8b|%Dj&MyJL-9*9n5ofdzU(PG z(I_VB*bGsrpeeb!R@BN!-?Bncw{kA9aJtxX1WnP*K4RO?ex`$^RPB&M~G9GIOxcW7xRR*Kw*1vUL=`(FF{;ceG-U_ z5;wSJkWa~C$*lyyf4^99qz|AA7tdOo0!KHC=e@G2nxW#q^|XCY=Sh69TzoN$*57Qa zb&aE=s^3Db>#hb~)9SvYs@Y3jy1II@cG@-CKKH+7WA*;}oi*B$4atC}iFS8ys&r>0 zE7tq-PnNSQ`e5!O)~a!w*H8IwwF}nM+wqp$!^g)V)l&1yBJW|(bO!)T+~;*Ov*A2cFst#Dcig1oBttnhIyWDDR%meL;9ZXZJ2 z?^)M@MA;}_3VqrshxM&ZMv`N~q__75_@XO1(dG9pQ}b}M#bju3ts&WHo70+R@a@{E ztKa*n{*Wn>aya0Y@m5ZQV}^#lv(*=xb$l1Oaiq0u%`n+V8&iMF z!;}?~X&*@7iC7H9AgT6W4I4*VjMO4Z_D+a4)^2IgVYX%(E#?o*RY~^iNSFTs7ch7G diff --git a/src/lang/qbittorrent_cs.ts b/src/lang/qbittorrent_cs.ts index 74a7d4d70..dc082d56c 100644 --- a/src/lang/qbittorrent_cs.ts +++ b/src/lang/qbittorrent_cs.ts @@ -1274,61 +1274,61 @@ Copyright © 2006 by Christophe Dumez<br> GUI - + Open Torrent Files Otevřít torrent soubory - - - - - + + + + + &Yes &Ano - - - - - + + + + + &No &Ne - + Are you sure you want to delete the selected item(s) in download list? Jste si jist, že chcete smazat vybrané položky ze seznamu stahování? - + Torrent Files Torrent soubory - - - - + + + + Are you sure? -- qBittorrent Jste si jist? -- qBittorrent - + Download finished Stahování dokončeno - - + + qBittorrent %1 e.g: qBittorrent v0.x qBittorrent %1 - - + + Connection status: Stav připojení: @@ -1341,27 +1341,27 @@ Copyright © 2006 by Christophe Dumez<br> Nebyly nalezeny žádné peery... - - + + qBittorrent qBittorrent - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s Rychlost stahování: %1 KiB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s Rychlost nahrávání: %1 KiB/s - + Are you sure you want to quit? Opravdu ukončit program? @@ -1389,14 +1389,14 @@ Copyright © 2006 by Christophe Dumez<br> '%1' obnoven. - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. Stahování %1 bylo dokončeno. - + I/O Error i.e: Input/Output Error Chyba I/O @@ -1407,12 +1407,12 @@ Copyright © 2006 by Christophe Dumez<br> Nastala chyba při pokusu o čtení či zápis %1. Disk je provděpodobně plný, stahování bylo pozastaveno - + Connection Status: Stav připojení: - + Online Online @@ -1426,18 +1426,18 @@ Copyright © 2006 by Christophe Dumez<br> Žádná příchozí spojení... - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. Nastala chyba (plný disk?), '%1' pozastaven. - + Search Hledat - + RSS RSS @@ -1451,13 +1451,13 @@ Copyright © 2006 by Christophe Dumez<br> Podpora DHT [ZAP], port: %1 - - + + DHT support [OFF] Podpora DHT [VYP] - + PeX support [ON] Podpora PeX [ZAP] @@ -1466,56 +1466,56 @@ Copyright © 2006 by Christophe Dumez<br> Podpora PeX [VYP] - + The download list is not empty. Are you sure you want to quit qBittorrent? Seznam stahování není prázdný. Opravdu chcete ukončit qBittorrent? - - + + Downloads Stahování - + Finished Dokončeno - + Are you sure you want to delete the selected item(s) in finished list? Jste si jist, že chcete smazat vybrané položky ze seznamu dokončených? - + UPnP support [ON] Podpora UPnP [ZAP] - + Encryption support [ON] Podpora šifrování [ZAP] - + Encryption support [FORCED] Podpora šifrování [VYNUCENO] - + Encryption support [OFF] Podpora šifrování [VYP] - + Alt+1 shortcut to switch to first tab Alt+1 - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -1524,34 +1524,34 @@ Opravdu chcete ukončit qBittorrent? Důvod: %2 - + Alt+2 shortcut to switch to second tab Alt+2 - + Alt+4 shortcut to switch to fourth tab Alt+4 - + Url download error Chyba stahování URL - + Couldn't download file at url: %1, reason: %2. Nemohu stáhnout soubor na URL: %1, důvod: %2. - + Are you sure you want to delete the selected item(s) from download list and from hard drive? Jste si jist, že chcete smazat vybrané položky ze seznamu stahování a pevného disku? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? Jste si jist, že chcete smazat vybrané položky ze seznamu dokončených a pevného disku? @@ -1561,50 +1561,50 @@ Opravdu chcete ukončit qBittorrent? '%1' byl trvale odstraněn. - + Alt+3 shortcut to switch to third tab Alt+3 - + Ctrl+F shortcut to switch to search tab Ctrl+F - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 qBittorrent naslouchá na portu: TCP/%1 - + UPnP support [OFF] Podpora UPnP [VYP] - + NAT-PMP support [ON] Podpora NAT-PMP [ZAP] - + NAT-PMP support [OFF] Podpora NAT-PMP [VYP] - + DHT support [ON], port: UDP/%1 Podpora DHT [ZAP], port: UDP/%1 - + Local Peer Discovery [ON] Local Peer Discovery [ZAP] - + Local Peer Discovery support [OFF] Podpora Local Peer Discovery [VYP] @@ -1614,48 +1614,48 @@ Opravdu chcete ukončit qBittorrent? '%1' byl odstraněn protože jeho poměr dosáhl nastaveného maxima. - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version qBittorrent %1 (Stahování: %2KiB/s, Nahrávání: %3KiB/s) - - + + DL: %1 KiB/s Stahování: %1 KiB/s - - + + UP: %1 KiB/s Nahrávání: %1 KiB/s - - + + Ratio: %1 Poměr: %1 - - + + DHT: %1 nodes DHT: %1 uzlů - - + + No direct connections. This may indicate network configuration problems. Žádná přímá spojení. To může značit problémy s nastavením sítě. - + Uploads Nahrávání - + Options were saved successfully. Nastavení bylo úspěšně uloženo. @@ -2204,86 +2204,86 @@ p, li { white-space: pre-wrap; } SearchEngine - + Cut Vyjmout - + Copy Kopírovat - + Paste Vložit - + Clear field Vyprázdnit pole - + Clear completion history Vymazat historii - + Empty search pattern Prázdný hledaný řetězec - + Please type a search pattern first Nejdříve prosím napište hledaný řetězec - - + + Results Výsledky - + Searching... Hledám... - + Search Engine Vyhledávač - - + + Search has finished Hledání ukončeno - + An error occured during search... Během hledání nastala chyba... - + Search aborted Hledání přerušeno - + Search returned no results Nebyly nalezeny žádné výsledky - + Results i.e: Search results Výsledky - - + + Unknown Neznámý @@ -2394,42 +2394,47 @@ p, li { white-space: pre-wrap; } Download in sequential order (slower but good for previewing) Stahovat v sekvenčním pořadí (pomalejší, ale dobré pro náhled) + + + Skip file checking and start seeding immediately + + Download in correct order (slower but good for previewing) Stahovat ve správném pořadí (pomalejší, ale dobré pro náhled) - + Add to download list in paused state Přidat do seznamu stahování jako pozastavené - + Add Přidat - + Cancel Zrušit - + Ignored Ignorovat - + Normal Normální - + High Vysoká - + Maximum Maximální @@ -2499,18 +2504,18 @@ p, li { white-space: pre-wrap; } bittorrent - + %1 reached the maximum ratio you set. '%1' - poměr dosáhl nastaveného maxima. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. '%1' byl trvale odstraněn. - + '%1' was removed. 'xxx.avi' was removed. '%1' byl odstraněn. @@ -2526,96 +2531,96 @@ p, li { white-space: pre-wrap; } '%1' obnoven. - + '%1' is not a valid magnet URI. '%1' není platný magnet URI. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. '%1' už je v seznamu stahování. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) '%1' obnoven. (rychlé obnovení) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. '%1' přidán do seznamu stahování. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' Nelze dekódovat soubor torrentu: '%1' - + This file is either corrupted or this isn't a torrent. Tento soubor je buď poškozen, nebo to není soubor torrentu. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked <font color='red'>%1</font> <i>byl zablokován kvůli filtru IP</i> - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned <font color='red'>%1</font> <i>byl zakázán kvůli poškozeným částem</i> - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 Rekurzivní stahování souboru %1 vloženého v torrentu %2 - + Unable to decode %1 torrent file. Nelze dekódovat soubor torrentu %1. - + Couldn't listen on any of the given ports. Nelze naslouchat na žádném z udaných portů. - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Namapování portů selhalo, zpráva: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Namapování portů bylo úspěšné, zpráva: %1 - + Fast resume data was rejected for torrent %1, checking again... Rychlé obnovení torrentu %1 bylo odmítnuto, zkouším znovu... - + Url seed lookup failed for url: %1, message: %2 Vyhledání URL seedu selhalo pro URL: %1, zpráva: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Stahuji '%1', prosím čekejte... @@ -2864,6 +2869,125 @@ p, li { white-space: pre-wrap; } Prosím napište alespoň jedno URL. + + downloadThread + + + + I/O Error + Chyba I/O + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + Neznámá chyba + + downloading @@ -3073,12 +3197,12 @@ p, li { white-space: pre-wrap; } Ne - + Uninstall warning Upozornění na odstranění - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. @@ -3087,141 +3211,141 @@ Můžete odstranit pouze moduly, které jste sám přidal. Nicméně, tyto moduly byly vypnuty. - + Uninstall success Odstranění bylo úspěšné - + Select search plugins Vybrat vyhledávače - - + + qBittorrent search plugins qBittorrent - vyhledávače - - - - - - - - + + + + + + + + Search plugin install Nainstalovat vyhledávač - - - + + + Yes Ano - - - - + + + + No Ne - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine V systému je již nainstalována novější verze vyhledávače %1. - - - - - + + + + + Search plugin update Aktualizovat vyhledávač - - + + Sorry, update server is temporarily unavailable. Omlouvám se, server s aktualizacemi je dočasně nedostupný. - + All your plugins are already up to date. Všechny zásuvné moduly jsou aktuální. - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine Vyhledávač %1 nelze aktualizovat, ponechávám starou verzi. - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine Vyhledávač %1 nelze nainstalovat. - + All selected plugins were uninstalled successfully Všechny zásuvné moduly byly úspěšně odstraněny - + %1 search engine plugin was successfully updated. %1 is the name of the search engine Vyhledávač %1 byl úspěšně aktualizován. - + %1 search engine plugin was successfully installed. %1 is the name of the search engine Vyhledávač %1 byl úspěšně nainstalován. - + Search engine plugin archive could not be read. Nelze přečíst zásuvný modul vyhledávače. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine Omlouvám se, instalace vyhledávače %1 selhala. - + New search engine plugin URL URL nového zásuvného modulu - + URL: URL: @@ -3832,54 +3956,44 @@ Nicméně, tyto moduly byly vypnuty. subDownloadThread - Host is unreachable - Hostitel je nedostupný + Hostitel je nedostupný - File was not found (404) - Soubor nenalezen (404) + Soubor nenalezen (404) - Connection was denied - Spojení bylo odepřeno + Spojení bylo odepřeno - Url is invalid - URL je neplatné + URL je neplatné - Connection failure - Chyba spojení + Chyba spojení - Connection was timed out - Spojení vypršelo + Spojení vypršelo - Incorrect network interface - Nesprávné síťové rozhraní + Nesprávné síťové rozhraní - Unknown error - Neznámá chyba + Neznámá chyba - I/O Error - Chyba I/O + Chyba I/O - Could not resolve proxy - Nemohu přeložit adresu proxy + Nemohu přeložit adresu proxy @@ -3937,12 +4051,12 @@ Nicméně, tyto moduly byly vypnuty. Nemohu vytvořit cestu pro uložení - + Invalid file selection Neplatný výběr souboru - + You must select at least one file in the torrent Musíte v torrentu vybrat alespoň jeden soubor diff --git a/src/lang/qbittorrent_da.qm b/src/lang/qbittorrent_da.qm index d9cba79c35aab186b68853b462a909556d203191..0219e9863d8b235bbfa8502bffabb49cc612cbb3 100644 GIT binary patch delta 781 zcmXBRZAep57zgnGz1!WqTTWar%cU(P-LmGUZq8TC+0cR+S~DBi5S6q-K`?up^g^Y! zBs)eyC|Ma+YU#}IOB$vIwTeQE{1jQU9+7I+!2Bldtcw{X zoJh-W7k6%I2R08Avq-~q5Qj*cJI-CLyF%Brf*DV_PEkD_`~}xLbQ@T4P0-*L-0YXA zb7*6#bAoAqC6-UEfb5AR^YMEise$gJyUS0+gVx-NY z1;D&t+IH~^kbYEppCvS0hB(Ced8rZn2G2gaY~c;_3Sd3Yo31;6Xg_aNm(ybb{GR$Z z0ADU>Y!ggW2&Uc;v@v}3tPO};NfyOg-o<|tkJI!Uh@Ml06w7pDF?8>+tYDG@V&Y|c z|Ao-hM@S*3VI0IwYdo@t{dBO*U$UvjY&w`(&}t`Lw5FH%I1O);hlWnkUO$t0P8&QS zA1(Mnzaw4#ys(U(EG2qL7W05qOLj3X;*%JdyJS(K;YR}BDQV=^E)prVFm6&PRVn&{ zx?k}?l!lI&73n=GRT+p+sS8q+RMu1+s4ObkSyokAR6_1)BE0 z*lTn{$;hx$(H2P{XjIk*mt{z|FF`8Z?1O2bru2^U>BkGt`&@h5nEp2A(nfXcUw}&n zQmlZX9*FH}F^1I;bcSn%SKu<@f#_~gQ>Lh8sbxwZssh)+0f_;k=4R2fN20btVq|I*!W{BF zSAeuI(!=PY?QnLr($_TV8Y+S9{qWvB18BbC$@`N)QUZS6KLP|hu{e|jB%dbB%qG^V zA|b3!6~eAJI03VjO&y5pX3}k+@ia86=(TA?6(6Bzk_W zw0lP)g$=*MQWYqG=wkTjHh*xy(Hrz6Y$kB`TzeTKZ*L2W?E# zENUK>nWozT#dBHu(@(%o2l3I|4l+aQ4al`qv|gfxgh(}^yxcQ(6^Ngew@MbMg1qDM z4_Y}@-p3Lk>IKP@=I16)^V>YffL%+xFdqnP;rY1Rc|gPrZ`GF5#zy&r?souRE*e!L zY8n?!DHXLzdDnLvz1c^yEYOkk?WvP{RjSAS5`m0SDBR=J63Acb;GVBMPDH#`uo tqa)f4-bT4b@J=MGsEJQ)P^*r+4)3n2t*odjD&AjKT~bu+eZA+4^gr#q+ZzA? diff --git a/src/lang/qbittorrent_da.ts b/src/lang/qbittorrent_da.ts index 9f58d5b8a..5cd8d23fc 100644 --- a/src/lang/qbittorrent_da.ts +++ b/src/lang/qbittorrent_da.ts @@ -1401,7 +1401,7 @@ Copyright © 2006 by Christophe Dumez<br> GUI - + Open Torrent Files Åbn Torrent Filer @@ -1410,25 +1410,25 @@ Copyright © 2006 by Christophe Dumez<br> Denne fil er enten korrupt eller ikke en torrent. - - - - - + + + + + &Yes &Ja - - - - - + + + + + &No &Nej - + Are you sure you want to delete the selected item(s) in download list? Er du sikker på at du vil slette det markerede fra download listen? @@ -1441,15 +1441,15 @@ Copyright © 2006 by Christophe Dumez<br> Downloader... - + Torrent Files Torrent Filer - - - - + + + + Are you sure? -- qBittorrent Er du sikker? -- qBittorrent @@ -1538,7 +1538,7 @@ Luk venglist denne først. Overførsler - + Download finished Download afsluttet @@ -1555,15 +1555,15 @@ Luk venglist denne først. Er du sikker på at du vil slette de markerede elementer i download listen og på harddisken? - - + + qBittorrent %1 e.g: qBittorrent v0.x qBittorrent %1 - - + + Connection status: Forbindelses status: @@ -1626,21 +1626,21 @@ Luk venglist denne først. qBittorrent %1 startet. - - + + qBittorrent qBittorrent - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s DL hastighed: %1 KB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s UP hastighed: %1 KB/s @@ -1661,7 +1661,7 @@ Luk venglist denne først. Gået i stå - + Are you sure you want to quit? Er du sikker på at du vil afslutte? @@ -1724,14 +1724,14 @@ Luk venglist denne først. '%1' fortsat. - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. %1 er hentet færdig. - + I/O Error i.e: Input/Output Error I/O Fejl @@ -1742,12 +1742,12 @@ Luk venglist denne først. Der opstod en fejl under forsøget på at skrive %1. Disken er måske fuld, downloaden er sat på pause - + Connection Status: Forbindelses Status: - + Online Online @@ -1783,120 +1783,120 @@ Luk venglist denne først. Downloader '%1', vent venligst... - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. Der opstod en fejl (fuld disk?), '%1' sat på pause. - + Search Søg - + RSS - - + + DHT support [OFF] - + PeX support [ON] - + The download list is not empty. Are you sure you want to quit qBittorrent? - - + + Downloads - + Finished Færdig - + Are you sure you want to delete the selected item(s) in finished list? - + UPnP support [ON] - + Encryption support [ON] - + Encryption support [FORCED] - + Encryption support [OFF] - + Alt+1 shortcut to switch to first tab - + Alt+2 shortcut to switch to second tab - + Alt+4 shortcut to switch to fourth tab - + Url download error - + Couldn't download file at url: %1, reason: %2. - + Are you sure you want to delete the selected item(s) from download list and from hard drive? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? - + Alt+3 shortcut to switch to third tab - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -1904,90 +1904,90 @@ Are you sure you want to quit qBittorrent? - + Ctrl+F shortcut to switch to search tab - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 - + UPnP support [OFF] - + NAT-PMP support [ON] - + NAT-PMP support [OFF] - + DHT support [ON], port: UDP/%1 - + Local Peer Discovery [ON] - + Local Peer Discovery support [OFF] - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version - - + + DL: %1 KiB/s - - + + UP: %1 KiB/s - - + + Ratio: %1 - - + + DHT: %1 nodes - - + + No direct connections. This may indicate network configuration problems. - + Uploads - + Options were saved successfully. Indstillingerne blev gemt. @@ -2567,12 +2567,12 @@ p, li { white-space: pre-wrap; } Søgemaskine - + Empty search pattern Tomt søge kriterie - + Please type a search pattern first Indtast venligst et søge kriterie først @@ -2585,13 +2585,13 @@ p, li { white-space: pre-wrap; } Du skal vælge mindst en søgemaskine. - - + + Results Resultater - + Searching... Søger... @@ -2634,65 +2634,65 @@ Changelog: Dit søge plugin er allerede opdateret fuldt ud. - + Cut - + Copy - + Paste - + Clear field - + Clear completion history - + Search Engine Søgemaskine - - + + Search has finished Søgningen er færdig - + An error occured during search... Der opstod en fejl under søgningen... - + Search aborted Søgning afbrudt - + Search returned no results Søgningen gav intet resultat - + Results i.e: Search results Resultater - - + + Unknown Ukendt @@ -2846,6 +2846,11 @@ Changelog: Download in sequential order (slower but good for previewing) + + + Skip file checking and start seeding immediately + + File name Fil navn @@ -2863,17 +2868,17 @@ Changelog: Download i korrekt rækkefølge (langsommere, men godt for smugkig) - + Add to download list in paused state Tilføj til download listen som sat på pause - + Add Tilføj - + Cancel Annuller @@ -2886,22 +2891,22 @@ Changelog: Vælg - + Ignored - + Normal - + High - + Maximum @@ -2971,18 +2976,18 @@ Changelog: bittorrent - + %1 reached the maximum ratio you set. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. - + '%1' was removed. 'xxx.avi' was removed. '%1' blev fjernet. @@ -2998,96 +3003,96 @@ Changelog: '%1' fortsat. - + '%1' is not a valid magnet URI. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. '%1' findes allerede i download listen. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) '%1' fortsat. (hurtig fortsættelse) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. '%1' lagt til download listen. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' Kan ikke dekode torrent filen: '%1' - + This file is either corrupted or this isn't a torrent. Denne fil er enten korrupt eller ikke en torrent. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 - + Unable to decode %1 torrent file. - + Couldn't listen on any of the given ports. Kunne ikke lytte på de opgivne porte. - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + Fast resume data was rejected for torrent %1, checking again... - + Url seed lookup failed for url: %1, message: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Downloader '%1', vent venligst... @@ -3372,6 +3377,125 @@ Changelog: Indtast venligst mindst en URL. + + downloadThread + + + + I/O Error + I/O Fejl + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + + + downloading @@ -3589,153 +3713,153 @@ Changelog: Falsk - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. - + Uninstall success - + Select search plugins - - + + qBittorrent search plugins - - - - - - - - + + + + + + + + Search plugin install - - - + + + Yes - - - - + + + + No - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine - - - - - + + + + + Search plugin update Søge plugin opdatering - - + + Sorry, update server is temporarily unavailable. Beklager, opdaterings-serveren er midlertidigt utilgængelig. - + All your plugins are already up to date. - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine - + All selected plugins were uninstalled successfully - + %1 search engine plugin was successfully updated. %1 is the name of the search engine - + %1 search engine plugin was successfully installed. %1 is the name of the search engine - + Search engine plugin archive could not be read. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine - + New search engine plugin URL - + URL: @@ -4441,54 +4565,8 @@ However, those plugins were disabled. subDownloadThread - - Host is unreachable - - - - - File was not found (404) - - - - - Connection was denied - - - - - Url is invalid - - - - - Connection failure - - - - - Connection was timed out - - - - - Incorrect network interface - - - - - Unknown error - - - - I/O Error - I/O Fejl - - - - Could not resolve proxy - + I/O Fejl @@ -4554,12 +4632,12 @@ However, those plugins were disabled. Kunne ikke oprette mappe svarende til den indtastede sti - + Invalid file selection Valg af filer ugyldigt - + You must select at least one file in the torrent Du skal vælge mindst en fil per torrent diff --git a/src/lang/qbittorrent_de.qm b/src/lang/qbittorrent_de.qm index 6ead513099bea04d59d095895e749ac3e9427683..7ce1a7607b84623f561ddcc4fc8b09678337e49f 100644 GIT binary patch delta 1875 zcmXBVdr(wW90&04y?5_k?k<;A(nZKXW@s0DZPI`bR19Ycbkr;nmV_dq#1|Hlrr-l4 ze1WV7utY2$5KmuQ68J!{1uVhIhF;?%6&+;6Cd-_xv>%lbs|n^>4&o!kfcfDAMQa!>bjJI`{vu0pPQ3>^EsYhqobm3+?ad0J|-OizQL)IWgX`3JZ6Z0v%C^PhUrM??rssUsT8*By4{QOl;&v zRB@eY+>S;hR+j*;=W&^t+u4W2f3m6Ibk-w=haQW>nP4|i@ZG!2Z2rWcz5KdpOf{z5#2D)Zr7qi2wUd zu9%w=3Cw_4P+dq_yvpY2tU?yc(nUHdr0@*-zhTMJv_&(4DK4(NP>Sq|rHrp|cNI(a zB>KK^BDZirO4yJOqfdnnsN*68*%>VU#kT=yHggVoys`&zP=?9?5spAPJu!sh5LhN5U){n$#t z{UgiK`wVT?wWqfM#YS%X4OXe2C}gs$ddukD-tt05!6v=LU2%ikv`kKW!4AxQR$kdm z`}kxw8>jdT{Y}o>lm?6`k@H8;IPLqA#VOVa`{nYj9|3I*+>U#4y|j%^$tL;4xf<$X z8@Fg3x7~v^DE@|BW8`nM>wxwI)}vUwnO*NUmuBW{0r$c)O!Ej(v-LAue+G`+VPPK8 zVwIldcti^8*%=Ru_s5eIbKET8oJH}wP31PsXAeEB8xxc)GiCg4jFJ`l4xNt&%KO#S zn^r~1t9=Xv6)HQ-6MzqXQFdP1L)rbVlt@%d^#P@H`dz@>uN>IjPrr96haRQVbD&%~ z>QAe@@kBW$GQiobxRR2o+Uv@hO_b!MT;-b2Eg)vCa_jFe07K1er8lt|@Z8KAR3G6! zbE^SDIlHaegv)HW!77|!c7tVflS$Q=UZ7Y8xThT4i*D6#*&mekK{aIOQmSqXt1wto z&Z)6(A0V(xT~JFi<^P)MxIqWCAVW=BZU9dCsL9*t#7umb>$Gy~?{ZJ==60!S)?Lc= zlN0LN{3G<_i&k@{t^-V~*f^ur_b2tft_N_$a*Hdu9hq!}(c*nE%wP`f1;&4F2=1WL z57n_sqg5zlUB>9B^Pz?#)2YAKr`%QkhGQMIz?W{r$@l4|^XZ1hlly^hIt)F%wBw)$ zhTftWN;aJP^)oEa(<-cEIiA*#IOE8XbWdA^F*vXv7*S&kn-mK8tuVekrkpa1FwUx^ zY?}75F1qI(_Ruqa=p|!&!ULcy)_5^#39S>zlC<$+;Ye1fSpy$>zPhjoczZuLV-mOZ zf@k6~T8JHBJzBC@YGYwubE9fTXo^e;wv5%hB&svZTN@cq(WXAqf?mG{)LFFWi_X)l zLgH@SriJ%B0dniK7#p?Vj4yM01voBi%gcgjFh19EN-}}Uy;`1n7}zqP)p@R_#%$1B zcO1aDecD%@Q-PtP_T9?iG>Fr*9|AT2tDChSz3EsT4di~EuRZ>-n;Kcg?54NHHi0#m z#(S3qdAaJ60b{7wsR&xTw15qmEMoU@HhhRpa5DRldFBFBUr`OcJ-#>n8Jz^gwo>aZ p<-2N!j4EX7ug)-erDm*IxjZ8!b-|MN(o#}g?uzQEF3Ytn`9EWESC0Sy delta 2652 zcmaKtc~BI07RSFm-ObQ53w!%Rp=dn`O!-`9)++F~-6`Iz z?1|#0RXz<4{19SN3{bsWX1$NhP7{ma^l?=XcZooKkIZA6WOgr=d2t%Vy-$EWB0L&N z#!(MQMcKg4CRWYGY2ya31*Qk|b|Vb{3{3U;6QE7A-@F@JqE(0Lze zW)d5=6=|FPMS?!Yf|+H&x%pV|!80JXQRbw*GAn&$c4Z@@t_oPVM&`zLncY>$_)ifT z;Lkb~6QV!+D~^YC0Q;ukW)Tle>Xq4b3VlsWfzhwwhy7Hy=`NnMz6KobWMgy>l5DbWGtjt^|nU6#-!x zz_DaSeDrW&N1`IWGXl7{f<5H}_4#3`!0A>+fts8@yk6${JBrnYc;L5Ctg9;rYX8e( z1U)x`WeV|JGOH1^zl-DJdy=Ws-^u)FGM|u1zvsuwEZ@Q}C?V4fp8SH3gGlXr{2~Ws zjrbG4=x!shKaD*U;saCo3cs&_hCF_gdzOlS;%l;K#!lz5*%k;1Co-x1FV>r(51FLK#+F)I8w!uCc1C?6`bLoIw# z_W_VlNZe2C7Cxz;3T*kF#dw59mp>5dN7n)!YlRk-H=zBqaKexR#03kdmX8Fga)eHE zJMdAX%+7LF?h(rcvks3?MP&>7(L)=j6-{FkfRrJkwTbH3@mO58aUY=HB`&v}p)qO` zODnU0<2B-%l_p?Rl~^{I#%sHgO;PI8XNlY1+YGd)%k0`L*7NVv?ino}K0#6Dx69lR zDzoE=*kNn{#{MLpT}-})j1(`5}nnWWziY6}5+%$upkQvs%wkzsm_B-U&xvIr|i0?K2T7) z0!n~oNlI7rTeOjODD&&c#uE)}n4}HdsjT8jQr&E2_0)SnK%a8g#y+5J3Y#ryUtOVW z$Rq>WKU5xHNe!L2T6sfz8%Qct-v0L&^weWzZ$=Z~wMu!nUslaL~X zuU|@~j%9f&eW^uC?$81wdZc;#Y2t>zA*J7}0@m52OpA(MgeRq}_h}c!E|XbtS!R8; z%;u>wFIXklJ?i?-EUB>U5WO7}rQ*pe0H3#|mCwv1;*qp&5{WJhmk!-LL*f#o=K7NW zQ>%Rg%cT3l6(BuXX2o2YUBN6y9qRY>R#iZBFA#Y|71l+5?M`EPYCSiNRjU&f?KjwU zwKja2>S#XQa?)SbcytHw^=Q?VUaCIifvR^y5^(UA%$`Cv%uCOOvIH-EIHw*ul%8q3 zqYfL<2Mpe)j+qz@1m&q`j@m{$^^SU0Emi(i604?XUSh|+(tO`hcP@AUTsWjYm$?Ku z|1KM;iBz2HVW}EDw~G~Pw35p!BbUOm*{nvBrKtLrJ=LVVQg=$D6se~zS2f-|X>j>z zhNe-kjgK`U3vbYC;1bL89yyZ* zvp;JNcsYSDBQy=)rvqcQYfg1f27DEo%T|BdEB7?t1eXBLCe2kp+DnIeWcKuFp1gaW zTzZ{}J~@iEgDlS{(y#i0cf$edj5^x8dD0X5>WpIteL@wN0@xLwC~gW92h9l>=W}<% zKKhib_IZ?;2_(0XFPHinmJZUDH{7V%J(&w(bEf&vbYKh;VZstv=xq0-Zz??K@SAS4 zT20wbv(2i@F_Xn(vN)0y>-VR{yng zAfErP;uRPiI-|*IHW^)Y(lAngTT<0++q0=lizkv223sRix?ZsT(LwYihLX{Dtw zjK^3y!Ur-APBdFgI=7GRq&YU1)u;;_KX!ch3sOcPiL}Wo%)ijZDozKK4upLv$>wnC z%nqH)O0CUaVpwc>QP(HXTb(9*jv@Owd0AOa!tmz|p$@5d9e-d&RY8#hIlNQt7Plg^ VHQ!({KWE_B&Xz?DSFa5h{|8A+6kPxS diff --git a/src/lang/qbittorrent_de.ts b/src/lang/qbittorrent_de.ts index 087fb2fd8..48485c691 100644 --- a/src/lang/qbittorrent_de.ts +++ b/src/lang/qbittorrent_de.ts @@ -1657,8 +1657,8 @@ qBittorrent beobachtet das Verzeichniss und starten den Download von vorhandenen :: By Christophe Dumez :: Copyright (c) 2006 - - + + qBittorrent qBittorrent @@ -1679,12 +1679,12 @@ qBittorrent beobachtet das Verzeichniss und starten den Download von vorhandenen UP Geschwindigkeit: - + Open Torrent Files Öffne Torrent-Dateien - + Torrent Files Torrent-Dateien @@ -1726,10 +1726,10 @@ qBittorrent beobachtet das Verzeichniss und starten den Download von vorhandenen Diese Datei ist entweder beschädigt, oder kein torrent. - - - - + + + + Are you sure? -- qBittorrent Sind Sie sicher? -- qBittorrent @@ -1738,20 +1738,20 @@ qBittorrent beobachtet das Verzeichniss und starten den Download von vorhandenen Wollen Sie wirklich alle Dateien aus der Download Liste löschen? - - - - - + + + + + &Yes &Ja - - - - - + + + + + &No &Nein @@ -1760,7 +1760,7 @@ qBittorrent beobachtet das Verzeichniss und starten den Download von vorhandenen Download Liste gelöscht. - + Are you sure you want to delete the selected item(s) in download list? Wollen Sie wirklich die ausgewählten Elemente aus der Download-Liste löschen? @@ -1820,7 +1820,7 @@ qBittorrent beobachtet das Verzeichniss und starten den Download von vorhandenen <b>qBittorrent</b><br>DL Geschwindigkeit: - + Finished Beendet @@ -2081,7 +2081,7 @@ Bitte schliessen Sie diesen zuerst. Wollen Sie wirklich die ausgewählten Elemente aus der Download Liste und von der Festplatte löschen? - + Download finished Download abgeschlossen @@ -2095,15 +2095,15 @@ Bitte schliessen Sie diesen zuerst. Suchmaschine - - + + qBittorrent %1 e.g: qBittorrent v0.x qBittorrent %1 - - + + Connection status: Verbindungs-Status: @@ -2166,15 +2166,15 @@ Bitte schliessen Sie diesen zuerst. qBittorrent %1 gestartet. - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s DL Geschwindigkeit: %1 KB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s UP Geschwindigkeit: %1 KiB/s @@ -2195,7 +2195,7 @@ Bitte schliessen Sie diesen zuerst. Angehalten - + Are you sure you want to quit? Wollen Sie wirklich beenden? @@ -2258,14 +2258,14 @@ Bitte schliessen Sie diesen zuerst. '%1' fortgesetzt. - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. %1 vollständig heruntergeladen. - + I/O Error i.e: Input/Output Error I/O Error @@ -2281,12 +2281,12 @@ Bitte schliessen Sie diesen zuerst. Ein Fehler ist aufgetreten (Festplatte voll?), '%1' angehalten. - + Connection Status: Verbindungs-Status: - + Online Online @@ -2322,23 +2322,23 @@ Bitte schliessen Sie diesen zuerst. Lade '%1', bitte warten... - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. Ein Fehler ist aufgetreten (Festplatte voll?), '%1' angehalten. - + Search Suche - + RSS RSS - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -2355,13 +2355,13 @@ Bitte schliessen Sie diesen zuerst. DHT Unterstützung [Aktiviert], port: %1 - - + + DHT support [OFF] DHT Unterstützung [Deaktiviert] - + PeX support [ON] PeX Unterstützung [Aktiviert] @@ -2370,15 +2370,15 @@ Bitte schliessen Sie diesen zuerst. PeX Unterstützung [Deaktiviert] - + The download list is not empty. Are you sure you want to quit qBittorrent? Die Download Liste ist nicht leer. Möchten sie qBittorrent wirklich beenden? - - + + Downloads Downloads @@ -2387,12 +2387,12 @@ Möchten sie qBittorrent wirklich beenden? Wollen Sie wirklich die ausgewählten Elemente aus der Beendet Liste und von der Festplatte löschen? - + Are you sure you want to delete the selected item(s) in finished list? Wollen Sie wirklich die ausgewählten Elemente aus der Beendet Liste löschen? - + UPnP support [ON] UPNP Unterstützung [Aktiviert] @@ -2401,17 +2401,17 @@ Möchten sie qBittorrent wirklich beenden? ACHTUNG! Die Verbreitung von urheberrechlich geschütztem Material ist gegen das Gesetz. - + Encryption support [ON] Verschlüsselung Unterstützung [Aktiviert] - + Encryption support [FORCED] Verschlüsselung Unterstützung [Erzwungen] - + Encryption support [OFF] Verschlüsselungs-Unterstützung [Deaktiviert] @@ -2425,13 +2425,13 @@ Möchten sie qBittorrent wirklich beenden? Verhältnis - + Alt+1 shortcut to switch to first tab Alt+1 - + Alt+2 shortcut to switch to second tab Alt+2 @@ -2442,18 +2442,18 @@ Möchten sie qBittorrent wirklich beenden? Alt+3, Strg+F - + Alt+4 shortcut to switch to fourth tab Alt+4 - + Url download error URL Download Fehler - + Couldn't download file at url: %1, reason: %2. Konnte Datei von URL: %1 nicht laden, Begründung: %2. @@ -2462,12 +2462,12 @@ Möchten sie qBittorrent wirklich beenden? Fast-Resume Daten wurden zurückgewiesen für torrent %1, prüfe nochmal... - + Are you sure you want to delete the selected item(s) from download list and from hard drive? Sind Sie sicher, daß Sie die ausgewählten Einträge aus der Download Liste und von der Festplatte löschen möchten? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? Sind Sie sicher, daß Sie die ausgewählten Einträge aus der Beendet Liste und von der Festplatte löschen möchten? @@ -2481,50 +2481,50 @@ Möchten sie qBittorrent wirklich beenden? URL Seed Lookup fehlgeschlagen für URL: %1, Begründung: %2 - + Alt+3 shortcut to switch to third tab Alt+3 - + Ctrl+F shortcut to switch to search tab Strg+F - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 qBittorrent lauscht auf Port: TCP/%1 - + UPnP support [OFF] UPnP Unterstützung [AUS] - + NAT-PMP support [ON] NAT-PMP Unterstützung [AN] - + NAT-PMP support [OFF] NAT-PMP Unterstützung [AUS] - + DHT support [ON], port: UDP/%1 DHT Unterstützung [EIN], Port: UDP/%1 - + Local Peer Discovery [ON] Lokale Peer Auffindung [AN] - + Local Peer Discovery support [OFF] Unterstützung für Lokale Peer Auffindung [AUS] @@ -2534,48 +2534,48 @@ Möchten sie qBittorrent wirklich beenden? '%1' wurde entfernt, weil das von Ihnen eingestellte maximale Verhältnis erreicht wurde. - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) - - + + DL: %1 KiB/s DL: %1 KiB/s - - + + UP: %1 KiB/s UP: %1 KiB/s - - + + Ratio: %1 Verhältnis: %1 - - + + DHT: %1 nodes DHT: %1 Nodes - - + + No direct connections. This may indicate network configuration problems. Keine direkten Verbindungen. Es könnte bedeuten, daß Sie Probleme mit Ihrer Netzwerkkonfiguration haben. - + Uploads Uploads - + Options were saved successfully. Optionen wurden erfolgreich gespeichert. @@ -3303,12 +3303,12 @@ p, li { white-space: pre-wrap; } Suchmaschine - + Empty search pattern Leere Suchanfrage - + Please type a search pattern first Bitte geben Sie zuerst eine Suchanfrage ein @@ -3321,13 +3321,13 @@ p, li { white-space: pre-wrap; } Sie müssen mindestens eine Suchmaschine auswählen. - - + + Results Ergebnisse - + Searching... Suche... @@ -3370,58 +3370,58 @@ Changelog: "Such"-Plugin ist schon auf dem neuesten Stand. - + Cut Ausschneiden - + Copy Kopieren - + Paste Einfügen - + Clear field Feld leeren - + Clear completion history Vervollständigungshistorie löschen - + Search Engine Suchmaschine - - + + Search has finished Suche abgeschlossen - + An error occured during search... Während der Suche ist ein Fehler aufgetreten ... - + Search aborted Suche abgebrochen - + Search returned no results Suche lieferte keine Ergebnisse - + Results i.e: Search results Ergebnisse @@ -3435,8 +3435,8 @@ Changelog: Konnte Such-Plugin Update nicht von URL: %1 laden, Begründung: %2. - - + + Unknown Unbekannt @@ -3614,6 +3614,11 @@ Changelog: Download in sequential order (slower but good for previewing) + + + Skip file checking and start seeding immediately + + File name Datei Name @@ -3631,17 +3636,17 @@ Changelog: In richtiger Reihenfolge herunterladen (langsamer, aber besser zum Vorschauen) - + Add to download list in paused state Der Download Liste im Pause-Modus hinzufügen - + Add Hinzufügen - + Cancel Abbrechen @@ -3658,22 +3663,22 @@ Changelog: Auswählen - + Ignored Ignoriert - + Normal Normal - + High Hoch - + Maximum Maximum @@ -3743,18 +3748,18 @@ Changelog: bittorrent - + %1 reached the maximum ratio you set. %1 hat das gesetzte maximale Verhältnis erreicht. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. '%1' wurde endgültig entfernt. - + '%1' was removed. 'xxx.avi' was removed. '%1' wurde entfernt. @@ -3770,96 +3775,96 @@ Changelog: '%1' wird fortgesetzt. - + '%1' is not a valid magnet URI. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. '%1' befindet sich bereits in der Download-Liste. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) '%1' wird fortgesetzt. (Schnelles Fortsetzen) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. '%1' wurde der Download-Liste hinzugefügt. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' Kann Torrent Datei nicht dekodieren: '%1' - + This file is either corrupted or this isn't a torrent. Diese Datei ist entweder beschädigt, oder kein Torrent. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked <font color='red'>%1</font> <i>wurde geblockt aufgrund Ihrer IP Filter</i> - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned <font color='red'>%1</font> <i>wurde gebannt aufgrund von beschädigten Teilen</i> - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 - + Unable to decode %1 torrent file. - + Couldn't listen on any of the given ports. Konnte nicht auf den angegebenen Ports lauschen. - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Port Mapping Fehler, Fehlermeldung: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Port Mapping erfolgreich, Meldung: %1 - + Fast resume data was rejected for torrent %1, checking again... Fast-Resume Daten für den Torrent %1 wurden zurückgewiesen, prüfe erneut... - + Url seed lookup failed for url: %1, message: %2 URL Seed Lookup für die URL: %1 ist fehlgeschlagen, Meldung: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Lade '%1', bitte warten... @@ -4192,6 +4197,125 @@ Changelog: Bitte geben Sie mindestens eine URL an. + + downloadThread + + + + I/O Error + + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + Unbekannter Fehler + + downloading @@ -4417,12 +4541,12 @@ Changelog: Falsch - + Uninstall warning Deinstallations Warnung - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. @@ -4431,7 +4555,7 @@ However, those plugins were disabled. Die Plugins wurden jedoch deaktiviert. - + Uninstall success Deinstallation erfolgreich @@ -4440,62 +4564,62 @@ Die Plugins wurden jedoch deaktiviert. Alle ausgewählten Plugins wurden erfolgreich deinstalliert - + Select search plugins Wähle Suchplugin - - + + qBittorrent search plugins qBittorrent Suchplugins - - - - - - - - + + + + + + + + Search plugin install Suchplugin installieren - - - + + + Yes - - - - + + + + No - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine Eine neuere Version des Suchmaschinen Plugins %1 ist bereits installiert. @@ -4511,17 +4635,17 @@ Die Plugins wurden jedoch deaktiviert. Das Suchmaschinen Plugin wurde erfolgreich installiert. - - - - - + + + + + Search plugin update Such-Plugin update - - + + Sorry, update server is temporarily unavailable. Update Server vorübergehend nicht erreichbar. @@ -4536,60 +4660,60 @@ Die Plugins wurden jedoch deaktiviert. Update des Suchplugins %1 fehlgeschlagen. - + All your plugins are already up to date. Alle Plugins sind auf dem neuesten Stand. - + All selected plugins were uninstalled successfully Alle ausgewählten Plugins wurden erfolgreich deinstalliert - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine %1 Suchmaschinen Plugin konnte nich aktualisiert werden, behalte alte Version. - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine %1 Suchmaschinen Plugin konnte nicht installiert werden. - + %1 search engine plugin was successfully updated. %1 is the name of the search engine %1 Suchmaschinen Plugin wurder erfolgreich geupdated. - + %1 search engine plugin was successfully installed. %1 is the name of the search engine %1 Suchmaschinen Plugin wurde erfolgreich installiert. - + Search engine plugin archive could not be read. Konnte Suchmaschinen Plugin Archiv nicht lesen. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine Installation des Suchmaschinen Plugins %1 fehlgeschlagen. - + New search engine plugin URL Neue Suchmaschinen Plugin URL - + URL: URL: @@ -5521,29 +5645,20 @@ Die Plugins wurden jedoch deaktiviert. subDownloadThread - Host is unreachable - Host ist unerreichbar + Host ist unerreichbar - File was not found (404) - Datei nicht gefunden (404) + Datei nicht gefunden (404) - Connection was denied - Verbindung verweigert + Verbindung verweigert - Url is invalid - URL ist ungültig - - - - I/O Error - + URL ist ungültig Connection forbidden (403) @@ -5558,29 +5673,24 @@ Die Plugins wurden jedoch deaktiviert. Inhalt wurde verschoben (301) - Connection failure - Verbindungs-Fehler + Verbindungs-Fehler - Connection was timed out - Verbidung wurde unterbrochen + Verbidung wurde unterbrochen - Incorrect network interface - Falsches Netzwerk Interface + Falsches Netzwerk Interface - Unknown error - Unbekannter Fehler + Unbekannter Fehler - Could not resolve proxy - Der Proxy konnte nicht aufgelöst werden + Der Proxy konnte nicht aufgelöst werden @@ -5646,12 +5756,12 @@ Die Plugins wurden jedoch deaktiviert. Speicher-Pfad konnte nicht erstellt werden - + Invalid file selection Ungültige Datei Auswahl - + You must select at least one file in the torrent Sie müssen mindestens eine Datei aus dem Torrent selektieren diff --git a/src/lang/qbittorrent_el.qm b/src/lang/qbittorrent_el.qm index 258436f96d757b3addcaaf372af4d01d73ab3b32..979a392ac47c6c7b6a799536803548515a30ad93 100644 GIT binary patch delta 1840 zcmXZdc~n$Y90&04+vfRZm>D*iAZ4;bL<5Wtk{eVm2q99j9|j}gC~icCmNKppVQAt{ z%~UEEk^+e&#V|mPtSqQ3v{FoIEJcTsSQJ6Kp4&g~bKaac_uTvYeebwrQhO%1$&gFBjRdD<6a_=mK@12fmL=@jll+>T5j{aeI+paHkS$u1_o&@cpv#an^ixk$=h z4vc;sN!xC*)ny<#rW<%=50cm41;+pHtU~_YsBn87NG;z2128GSrS^48qxHrpb zvh1rrHdZ+Nv?tKFo3i8}_lv`X_JDVQqBn%A`{My;DV53Alw{E__Ge&XjX0?)2#CBb zMuhmX4kwBcCr1N!4vI6noWKLe#ni=Yun8-;an<571MAGCVD5lHT$>TW+TAD?mTzE* zDIz~5NIW^75|r5~ozl3RmB7$MX>uCteQYteJ6?)tjsh0caqCUeG#h)Le?Rx=Dk*to z0Z_18N`Bji)#93zwuDXUkrpZKN-gk96B%{W^_Rn>P41ro?PJNNvk1MEr;8Bs=#Vb> z(W7$8G`6a57R#y6v;*bg@{;_2f!~|tRcZt9?S1l^z2})nx^n3Sxs(}0W~W#RS5faMiTmfMIbWpN#wRr5ni?&c4H zQDw@jIj30A-c(kVqyyKhm36DLfIw0T?qdNwl};Omj08tA;F`dnt!Iaf{1`f)zjJk&fd zmV_N8YF@}(wl#azrRA)Yf1jY?hLQSTz0@rdTgjPYG}B;t@_BV{Up6o|N&VQDjkWe8 zwOS;g@g=p!#@2u1lv=-+U$KS$SU^KfVZt?&+H$t$uMjf`_m0i!>AD* zfOoDT^zjhjes4qMn4N52J!^6?o&c5z?kNn(MX+N0OTx0>d^(P&04|eM{)l{&c7$%sGPV8sbNEA8U z10~#zr{NwELOat2H g&8EzpWs4W)WMszAdnqd;vnI5K!fW$gg>$<90Gp{~F#rGn delta 2677 zcmaKtdsGu=8pfZ=WHL-bfS?$`OVaLEz>0Xqq5^Fd1Xe{>5oAG|lBm&`)Ns{Wuqs+v z>qZ^(tx^3R>g(-hjv~7{JI{4>nefprHDLR1Was0v+yfeZV?K%zzN;{5 zJ|((n4aR(7rl(F|%q9tVx`|~f#!su-i}6cV04-gRXq^r8T!_S#zf#>MB#p=i+EyWH zWHXRcgrtJ!KK98jY%e8sJi9vr5N>4s>%eF)nQaM7tJDXka2tE|1O7UW+x(Ag;PV`A_g^|v zm_9PA8)ZIDV55}1y?^|kyB7FQVDTs1?akwWrg-+L(!ja1Ql(x}DqAj128^V|%^j6d~v4O&*2}OK}BNy-)&xfT9 zqfD2`YSBQDl`{7p;(CZYRa;pM3 zpTnAjD0Smqewp`oz|}?;rqXlUSb{2o3uG%)!F?Ud36Z^lW3MZd&kD~q-i028W-+sMtH%A%5R zpth2Y68)vmlqJ22f#x#yk*L>sE00(Y0#)%cAAQ4$#X;PAtU(Mm}0Q%#{yi z-aIH+`a}YzM}qC={=n?*M6zf)o&8$=%;&-Q3%^Fr@+%_?53$^k; zS?rm*hx+_+aXC+woXucC8huPhal>OPFeOpk*`2iJZ4Gxl(Ml*s7V_Nrcb;AL- zJ@d%yPv2vs+=Kg?CDn>!z`l26-ah_<9QI4P{-HqYJjri*GnM#63S2UcO1sU9-Ge#C z>fH_T^Q4K3&(I+^%iK3#=7lFR?`U3-u9D1rd^=l-xSam=xHR6X*R<9kz ztz%k`iHZjo*$fYTpqF}g7CrK?v$|sUTHyJ9b$z26=+Rx>xHOt387lMHEmrCgqBwAh z-SF@a9Iolwl{Vc!stI`Q4&XaeGw>~Xmvr&fjCgZ3oja8#wwSWK`Irs#^ymCps%N(D zZOxIShv2x8nvBY2Ok=&F{b+eQeJ~bl=Sv%bvenup(bSdJX6>45 zr|4r;q}}eG0sK_0E&pi(5PVg8_~=kTH%EKM?n7pR_MCw{x7MOP?@i~T!6@^$6m9E5 z+W&AYYtZFM3p_r)Le_gWnpwPqb=y43x0A&*gFW^PX$1~GW5wPb)blmCUEZ zc*FIhp0}261#TET?_YWsh_-sRM5O|$_pRXg-134BQ!C5EPc04CcIP+nNB9zc55Jc$ zW8a5#8R9+6VYge-GOP}}ak9y3%XC^q`uytBGv6QX$hO-YCiA$dPK(LR@wD8XU&tTe ztN0535MSZiAM5jn{n@5;quFA&TFmW8^yD}4rIbK5e-K8#mgG*7U^QRkk{j6h|Ku{P zGc0DKBQv8N#i6Y2z9H{xQrg9TOV>`)JpmwuQd(`Gi>9T`Ta zCEa1mvKT*bI&x;UBR_x=CNaK@0@S+XU)+7e@1iwV&{7Io!RJ-F77%~|=tEcF%ZQz$ ztTv0$)f!jO$&O6B*%&aO&w#*oLI&{bNc;$O#U)?%qEi%*ulk>m6!B%04tddz^bDgl z-I!^oX{Ajyy>Dx8kRAVM1j;)G!H9dQCdCBD86%xehqIj|-{MzOYE@Ky8M&d`Udoi_ zNLp6dkpTcWy< qVMTAUVkKWg9dgCYq-eI6`FkWdZLVHe?O7(9^%ZWcsCDPAsQwGBl~Bn5 diff --git a/src/lang/qbittorrent_el.ts b/src/lang/qbittorrent_el.ts index f57662ce3..5610920f1 100644 --- a/src/lang/qbittorrent_el.ts +++ b/src/lang/qbittorrent_el.ts @@ -1724,7 +1724,7 @@ Copyright © 2006 από τον Christophe Dumez<br> GUI - + Open Torrent Files Άνοιγμα Αρχείων τορεντ @@ -1745,25 +1745,25 @@ Copyright © 2006 από τον Christophe Dumez<br> Σίγουρα θέλετε να διαγράψετε όλα τα αρχεία στην λίστα κατεβάσματος? - - - - - + + + + + &Yes &Ναι - - - - - + + + + + &No &Όχι - + Are you sure you want to delete the selected item(s) in download list? Είστε σίγουρος οτι θέλετε να διαγράψετε το(α) επιλεγμλένα αντικείμενο(α) από την λίστα κατεβάσματος? @@ -1780,7 +1780,7 @@ Copyright © 2006 από τον Christophe Dumez<br> kb/s - + Finished Τελείωσε @@ -1825,7 +1825,7 @@ Copyright © 2006 από τον Christophe Dumez<br> Δεν μπόρεσε να δημιουργηθεί η κατηγορία: - + Torrent Files Αρχεία Τορεντ @@ -1885,16 +1885,16 @@ Copyright © 2006 από τον Christophe Dumez<br> qBittorrent - - + + qBittorrent qBittorrent - - - - + + + + Are you sure? -- qBittorrent Είστε σίγουρος? -- qBittorrent @@ -2172,7 +2172,7 @@ Please close the other one first. Είστε σίγουρος/η οτι θέλετε να διαγράψετε το(α) επιλεγμένο(α) αντικείμενο(α) από τη λίστα κατεβάσματος και το σκληρό δίσκο? - + Download finished Το κατέβασμα τελείωσε @@ -2186,15 +2186,15 @@ Please close the other one first. Μηχανή Αναζήτησης - - + + qBittorrent %1 e.g: qBittorrent v0.x qBittorrent %1 - - + + Connection status: Κατάσταση Σύνδεσης: @@ -2257,15 +2257,15 @@ Please close the other one first. Εκκινήθηκε το qBittorrent %1. - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s Ταχύτητα Κατεβάσματος: %1 KiB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s Ταχύτητα Ανεβάσματος: %1 KiB/s @@ -2286,7 +2286,7 @@ Please close the other one first. Αποτυχία λειτουργίας - + Are you sure you want to quit? Είστε σίγουρος/η οτι θέλετε να κλείσετε την εφαρμογή? @@ -2349,14 +2349,14 @@ Please close the other one first. Το '%1' ξανάρχισε. - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. Έχει τελειώσει το κατέβασμα του '%1'. - + I/O Error i.e: Input/Output Error I/O Λάθος @@ -2372,12 +2372,12 @@ Please close the other one first. Ένα σφάλμα προέκυψε (δίσκος πλήρης?), το '%1' είναι σε παύση. - + Connection Status: Κατάσταση Σύνδεσης: - + Online Online @@ -2413,23 +2413,23 @@ Please close the other one first. Κατέβασμα του '%1', παρακαλώ περιμένετε... - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. Ένα σφάλμα προέκυψε (δίσκος πλήρης?), το '%1' είναι σε παύση. - + Search Εύρεση - + RSS RSS - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -2447,13 +2447,13 @@ Please close the other one first. Υποστήριξη DHT [ΝΑΙ], θύρα: %1 - - + + DHT support [OFF] Υποστήριξη DHT [ΟΧΙ] - + PeX support [ON] Υποστήριξη PeX [ΝΑΙ] @@ -2462,25 +2462,25 @@ Please close the other one first. Υποστήριξη PeX [ΟΧΙ] - + The download list is not empty. Are you sure you want to quit qBittorrent? Η λίστα κατεβάσματος δεν είναι άδεια. Σίγουρα θέλετε να κλείσετε το qBittorrent? - - + + Downloads Κατέβασματα - + Are you sure you want to delete the selected item(s) in finished list? Είστε σίγουρος οτι θέλετε να διαγράψετε το(α) επιλεγμλένα αντικείμενο(α) από την λίστα των ολοκληρωμένων? - + UPnP support [ON] Υποστήριξη UPnP [ΝΑΙ] @@ -2489,17 +2489,17 @@ Are you sure you want to quit qBittorrent? Προσοχή, η διακίνηση υλικού προστατευόμενου από πνευματικά δικαιώματα χωρίς άδεια είναι παράνομη. - + Encryption support [ON] Υποστήριξη κρυπτογράφησης [ΝΑΙ] - + Encryption support [FORCED] Υποστήριξη κρυπτογράφησης [ΑΝΑΓΚΑΣΤΙΚΑ] - + Encryption support [OFF] Υποστήριξη κρυπτογράφησης [ΟΧΙ] @@ -2513,13 +2513,13 @@ Are you sure you want to quit qBittorrent? Αναλογία - + Alt+1 shortcut to switch to first tab Alt+1 - + Alt+2 shortcut to switch to second tab Alt+2 @@ -2530,18 +2530,18 @@ Are you sure you want to quit qBittorrent? Alt+3, Ctrl+F - + Alt+4 shortcut to switch to fourth tab Alt+4 - + Url download error Σφάλμα κατεβάσματος url - + Couldn't download file at url: %1, reason: %2. Αδύνατο κατέβασμα αρχείου από το url: %1,αιτία: %2. @@ -2550,12 +2550,12 @@ Are you sure you want to quit qBittorrent? Γρήγορη συνέχεια κατεβάσματος αρχείων απορρίφθηκε για το τορεντ %1, επανέλεγχος... - + Are you sure you want to delete the selected item(s) from download list and from hard drive? Είστε σίγουρος οτι θέλετε να διαγράψετε το(α) επιλεγμλένα αντικείμενο(α) από την λίστα κατεβάσματος και από το σκληρό δίσκο? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? Είστε σίγουρος οτι θέλετε να διαγράψετε το(α) επιλεγμλένα αντικείμενο(α) από το σκληρό δίσκο? @@ -2569,50 +2569,50 @@ Are you sure you want to quit qBittorrent? Αποτυχία ελέγχου url μοιράσματος για το url: %1, μήνυμα: %2 - + Alt+3 shortcut to switch to third tab Alt+3 - + Ctrl+F shortcut to switch to search tab Ctrl+F - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 Το qBittorrent χρησιμοποιεί τη θύρα: TCP/%1 - + UPnP support [OFF] Υποστήριξη UPnP [ΟΧΙ] - + NAT-PMP support [ON] Υποστήριξη NAT-PMP [NAI] - + NAT-PMP support [OFF] Υποστήριξη NAT-PMP [OXI] - + DHT support [ON], port: UDP/%1 Υποστήριξη DHT [NAI], θύρα: UDP/%1 - + Local Peer Discovery [ON] Ανακάλυψη Τοπικών Συνδέσεων [ΝΑΙ] - + Local Peer Discovery support [OFF] Ανακάλυψη Τοπικών Συνδέσεων [ΟΧΙ] @@ -2622,48 +2622,48 @@ Are you sure you want to quit qBittorrent? Το '%1' αφαιρέθηκε επειδή η αναλογία του έφτασε τη μέγιστη τιμή που θέσατε. - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) - - + + DL: %1 KiB/s DL: %1 KiB/s - - + + UP: %1 KiB/s UP: %1 KiB/s - - + + Ratio: %1 Αναλογία: %1 - - + + DHT: %1 nodes DHT: %1 κόμβοι - - + + No direct connections. This may indicate network configuration problems. Χωρίς απευθείας συνδέσεις. Αυτό μπορεί να οφείλεται σε προβλήματα ρυθμίσεων δικτύου. - + Uploads Ανεβάσματα - + Options were saved successfully. Οι επιλογές αποθηκεύτηκαν επιτυχώς. @@ -3400,12 +3400,12 @@ p, li { white-space: pre-wrap; } Μηχανή αναζήτησης - + Empty search pattern Κενό πρότυπο εύρεσης - + Please type a search pattern first Παρακαλώ εισάγετε ένα σχέδιο εύρεσης πρώτα @@ -3418,13 +3418,13 @@ p, li { white-space: pre-wrap; } Πρέπει να επιλέξετε τουλάχιστο μια μηχανή αναζήτησης. - - + + Results Αποτελέσματα - + Searching... Αναζήτηση... @@ -3467,58 +3467,58 @@ Changelog: Το plugin αναζήτησης είναι ήδη αναβαθμισμένο. - + Cut Αποκοπή - + Copy Αντιγραφή - + Paste Επικόλληση - + Clear field Εκκαθάριση πεδίου - + Clear completion history Εκκαθάριση ιστορικού φόρμας - + Search Engine Μηχανή Αναζήτησης - - + + Search has finished Η αναζήτηση τελείωσε - + An error occured during search... Σφάλμα κατά την εύρεση... - + Search aborted Αναζήτηση διεκόπη - + Search returned no results Η αναζήτηση δεν έφερε αποτελέσματα - + Results i.e: Search results Αποτελέσματα @@ -3532,8 +3532,8 @@ Changelog: Αδύνατο κατέβασμα plugin αναζήτησης από το url: %1,αιτία: %2. - - + + Unknown Άγνωστο @@ -3711,6 +3711,11 @@ Changelog: Download in sequential order (slower but good for previewing) Κατέβασμα σε συνεχόμενη σειρά (πιο αργό αλλά καλό για preview) + + + Skip file checking and start seeding immediately + + File name Όνομα αρχείου @@ -3728,17 +3733,17 @@ Changelog: Κατέβασμα στη σωστή σειρά (πιο αργό αλλα καλό για προεπισκόπηση) - + Add to download list in paused state Προσθήκη στη λίστα κατεβάσματος σε κατάσταση παύσης - + Add Προσθήκη - + Cancel Ακύρωση @@ -3755,22 +3760,22 @@ Changelog: Επιλογή - + Ignored Αγνοήθηκε - + Normal Κανονικό - + High Υψηλό - + Maximum Μέγιστο @@ -3844,18 +3849,18 @@ Changelog: bittorrent - + %1 reached the maximum ratio you set. Το %1 έφτασε στη μέγιστη αναλογία που θέσατε. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. '%1' διαγράφηκε για πάντα. - + '%1' was removed. 'xxx.avi' was removed. Το '%1' αφαιρέθηκε. @@ -3871,96 +3876,96 @@ Changelog: Το '%1' ξανάρχισε. - + '%1' is not a valid magnet URI. Το '%1' δεν είναι ένα έγκυρο magnet URI. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. Το '%1' είναι ήδη στη λίστα κατεβάσματος. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) Το '%1' ξανάρχισε. (γρήγορη επανασύνδεση) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. Το '%1' προστέθηκε στη λίστα κατεβάσματος. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' Αδύνατο να αποκωδικοποιηθεί το αρχείο τορεντ: '%1' - + This file is either corrupted or this isn't a torrent. Το αρχείο είτε είναι κατεστραμμένο, ή δεν ειναι τορεντ. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked <font color='red'>%1</font> <i>μπλοκαρίστηκε εξαιτίας του IP φίλτρου</i> - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned <font color='red'>%1</font> <i>απαγορεύτηκε εξαιτίας κατεστραμμένων κομματιών</i> - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 Προγραμματισμένο κατέβασμα του αρχείου %1,που βρίσκεται στο τόρεντ %2 - + Unable to decode %1 torrent file. Αδύνατο να αποκωδικοποιηθεί το αρχείο τόρεντ %1. - + Couldn't listen on any of the given ports. Δεν "ακροάστηκα" καμία σπό τις δωσμένες θύρες. - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Σφάλμα χαρτογράφησης θυρών, μήνυμα: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Χαρτογράφηση θυρών επιτυχής, μήνυμα: %1 - + Fast resume data was rejected for torrent %1, checking again... Γρήγορη συνέχεια κατεβάσματος αρχείων απορρίφθηκε για το τορεντ %1, επανέλεγχος... - + Url seed lookup failed for url: %1, message: %2 Αποτυχία ελέγχου url μοιράσματος για το url: %1, μήνυμα: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Κατέβασμα του '%1', παρακαλώ περιμένετε... @@ -4293,6 +4298,125 @@ Changelog: Παρακαλώ εισάγετε τουλάχιστο ένα URL. + + downloadThread + + + + I/O Error + + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + Άγνωστο σφάλμα + + downloading @@ -4518,12 +4642,12 @@ Changelog: Λάθος - + Uninstall warning Προειδοποίηση απεγκατάστασης - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. @@ -4532,7 +4656,7 @@ However, those plugins were disabled. Ωστόσο, αυτά τα plugin απενεργοποιήθηκαν. - + Uninstall success Επιτυχής απεγκατάσταση @@ -4541,62 +4665,62 @@ However, those plugins were disabled. Όλα τα επιλεγμένα plugin απεγκαταστήθηκαν επιτυχώς - + Select search plugins Επιλέξτε plugin αναζήτησης - - + + qBittorrent search plugins plugin αναζήτησης του qBittorrent - - - - - - - - + + + + + + + + Search plugin install Εγκατάσταση plugin αναζήτησης - - - + + + Yes Ναι - - - - + + + + No Όχι - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine Μια πιο πρόσφατη έκδοση plugin αναζήτησης %1 έχει ήδη εγκατασταθεί. @@ -4612,17 +4736,17 @@ However, those plugins were disabled. Το plugin αναζήτησης %1 εγκαταστήθηκε επιτυχώς. - - - - - + + + + + Search plugin update Αναβάθμιση plugin αναζήτησης - - + + Sorry, update server is temporarily unavailable. Λυπούμαστε, ο εξυπηρετητής αναβάθμισης δεν είναι προσωρινά διαθέσιμος. @@ -4637,60 +4761,60 @@ However, those plugins were disabled. Λυπούμαστε, η αναβάθμιση του plugin αναζήτησης %1 απέτυχε. - + All your plugins are already up to date. Όλα τα plugin σας είναι ήδη αναβαθμισμένα. - + All selected plugins were uninstalled successfully Όλα τα επιλεγμένα plugin απεγκαταστάθηκαν επιτυχώς - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine Το plugin αναζήτησης %1 δεν ήταν δυνατό να αναβαθμιστεί, παραμένει η παλιά έκδοση. - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine Το plugin αναζήτησης %1 δεν ήταν δυνατό να εγκατασταθεί. - + %1 search engine plugin was successfully updated. %1 is the name of the search engine Το plugin αναζήτησης %1 αναβαθμίστηκε επιτυχώς. - + %1 search engine plugin was successfully installed. %1 is the name of the search engine Το plugin αναζήτησης %1 εγκαταστάθηκε επιτυχώς. - + Search engine plugin archive could not be read. Το αρχείο του plugin αναζήτησης δεν ήταν δυνατό να διαβαστεί. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine Λυπούμαστε, η εγκατάσταση του plugin αναζήτησης %1 απέτυχε. - + New search engine plugin URL Νέο URL plugin αναζήτησης - + URL: URL: @@ -5601,29 +5725,24 @@ However, those plugins were disabled. subDownloadThread - Host is unreachable - Ο φορέας δεν βρέθηκε + Ο φορέας δεν βρέθηκε - File was not found (404) - Το αρχείο δε βρέθηκε (404) + Το αρχείο δε βρέθηκε (404) - Connection was denied - Άρνηση σύνδεσης + Άρνηση σύνδεσης - Url is invalid - Άκυρο url + Άκυρο url - I/O Error - Σφάλμα I/O + Σφάλμα I/O Connection forbidden (403) @@ -5638,29 +5757,24 @@ However, those plugins were disabled. Το περιεχόμενο έχει μετακινηθεί (301) - Connection failure - Σφάλμα σύνδεσης + Σφάλμα σύνδεσης - Connection was timed out - Τέλος χρόνου σύνδεσης + Τέλος χρόνου σύνδεσης - Incorrect network interface - Λανθασμένο interface δικτύου + Λανθασμένο interface δικτύου - Unknown error - Άγνωστο σφάλμα + Άγνωστο σφάλμα - Could not resolve proxy - Δεν μπόρεσε να βρεθεί το proxy + Δεν μπόρεσε να βρεθεί το proxy @@ -5726,12 +5840,12 @@ However, those plugins were disabled. Δεν μπόρεσε να δημιουργηθεί η διαδρομή αποθήκευσης - + Invalid file selection Άκυρη επιλογή αρχείου - + You must select at least one file in the torrent Πρέπει να επιλέξετε τουλάχιστο ένα αρχείο του τορεντ diff --git a/src/lang/qbittorrent_en.ts b/src/lang/qbittorrent_en.ts index cee2bfaf1..74794e385 100644 --- a/src/lang/qbittorrent_en.ts +++ b/src/lang/qbittorrent_en.ts @@ -1092,227 +1092,227 @@ p, li { white-space: pre-wrap; } GUI - + Open Torrent Files - - - - - + + + + + &Yes - - - - - + + + + + &No - + Are you sure you want to delete the selected item(s) in download list? - + Torrent Files - - - - + + + + Are you sure? -- qBittorrent - + Download finished - - + + qBittorrent %1 e.g: qBittorrent v0.x - - + + Connection status: - - + + qBittorrent - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s - + Are you sure you want to quit? - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. - + I/O Error i.e: Input/Output Error - + Connection Status: - + Online - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. - + Search - + RSS - - + + DHT support [OFF] - + PeX support [ON] - + The download list is not empty. Are you sure you want to quit qBittorrent? - - + + Downloads - + Finished - + Are you sure you want to delete the selected item(s) in finished list? - + UPnP support [ON] - + Encryption support [ON] - + Encryption support [FORCED] - + Encryption support [OFF] - + Alt+1 shortcut to switch to first tab - + Alt+2 shortcut to switch to second tab - + Alt+4 shortcut to switch to fourth tab - + Url download error - + Couldn't download file at url: %1, reason: %2. - + Are you sure you want to delete the selected item(s) from download list and from hard drive? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? - + Alt+3 shortcut to switch to third tab - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -1320,90 +1320,90 @@ Are you sure you want to quit qBittorrent? - + Ctrl+F shortcut to switch to search tab - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 - + UPnP support [OFF] - + NAT-PMP support [ON] - + NAT-PMP support [OFF] - + DHT support [ON], port: UDP/%1 - + Local Peer Discovery [ON] - + Local Peer Discovery support [OFF] - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version - - + + DL: %1 KiB/s - - + + UP: %1 KiB/s - - + + Ratio: %1 - - + + DHT: %1 nodes - - + + No direct connections. This may indicate network configuration problems. - + Uploads - + Options were saved successfully. @@ -1875,86 +1875,86 @@ p, li { white-space: pre-wrap; } SearchEngine - + Cut - + Copy - + Paste - + Clear field - + Clear completion history - + Empty search pattern - + Please type a search pattern first - - + + Results - + Searching... - + Search Engine - - + + Search has finished - + An error occured during search... - + Search aborted - + Search returned no results - + Results i.e: Search results - - + + Unknown @@ -2067,36 +2067,41 @@ p, li { white-space: pre-wrap; } + Skip file checking and start seeding immediately + + + + Add to download list in paused state - + Add - + Cancel - + Ignored - + Normal - + High - + Maximum @@ -2166,113 +2171,113 @@ p, li { white-space: pre-wrap; } bittorrent - + %1 reached the maximum ratio you set. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. - + '%1' was removed. 'xxx.avi' was removed. - + '%1' is not a valid magnet URI. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' - + This file is either corrupted or this isn't a torrent. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 - + Unable to decode %1 torrent file. - + Couldn't listen on any of the given ports. - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + Fast resume data was rejected for torrent %1, checking again... - + Url seed lookup failed for url: %1, message: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... @@ -2505,6 +2510,125 @@ p, li { white-space: pre-wrap; } + + downloadThread + + + + I/O Error + + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + + + downloading @@ -2694,153 +2818,153 @@ p, li { white-space: pre-wrap; } engineSelectDlg - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. - + Uninstall success - + Select search plugins - - + + qBittorrent search plugins - - - - - - - - + + + + + + + + Search plugin install - - - + + + Yes - - - - + + + + No - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine - - - - - + + + + + Search plugin update - - + + Sorry, update server is temporarily unavailable. - + All your plugins are already up to date. - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine - + All selected plugins were uninstalled successfully - + %1 search engine plugin was successfully updated. %1 is the name of the search engine - + %1 search engine plugin was successfully installed. %1 is the name of the search engine - + Search engine plugin archive could not be read. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine - + New search engine plugin URL - + URL: @@ -3408,59 +3532,6 @@ However, those plugins were disabled. - - subDownloadThread - - - Host is unreachable - - - - - File was not found (404) - - - - - Connection was denied - - - - - Url is invalid - - - - - Connection failure - - - - - Connection was timed out - - - - - Incorrect network interface - - - - - Unknown error - - - - - I/O Error - - - - - Could not resolve proxy - - - torrentAdditionDialog @@ -3508,12 +3579,12 @@ However, those plugins were disabled. - + Invalid file selection - + You must select at least one file in the torrent diff --git a/src/lang/qbittorrent_es.qm b/src/lang/qbittorrent_es.qm index f85243dfcbdd745334d8cfbd22015d4edc27948a..56e3cafa48e8cfc42458efabd1befb396b36effb 100644 GIT binary patch delta 1754 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 se pudo crear el directorio: - + Open Torrent Files Abrir archivos Torrent - + Torrent Files Archivos Torrent @@ -1717,20 +1717,20 @@ p, li { white-space: pre-wrap; } ¿Seguro que quieres eliminar todos los archivos de la lista de descargas? - - - - - + + + + + &Yes &Sí - - - - - + + + + + &No &No @@ -1739,7 +1739,7 @@ p, li { white-space: pre-wrap; } Lista de descargas borrada. - + Are you sure you want to delete the selected item(s) in download list? ¿Seguro que quieres borrar el o los elemento(s) seleccionados de la lista de descargas? @@ -1775,7 +1775,7 @@ p, li { white-space: pre-wrap; } continuada. - + Finished Terminada @@ -1819,16 +1819,16 @@ p, li { white-space: pre-wrap; } qBittorrent - - + + qBittorrent qBittorrent - - - - + + + + Are you sure? -- qBittorrent ¿Estás seguro? -- qBittorrent @@ -2086,7 +2086,7 @@ Por favor cierra el otro antes. ¿Seguro que deseas borrar el o los elementos seleccionados de la lista de descargas y del disco duro? - + Download finished Descarga terminada @@ -2100,15 +2100,15 @@ Por favor cierra el otro antes. Motor de Búsqueda - - + + qBittorrent %1 e.g: qBittorrent v0.x qBittorrent %1 - - + + Connection status: Estado de la conexión: @@ -2171,15 +2171,15 @@ Por favor cierra el otro antes. qBittorrent %1 iniciado. - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s Velocidad de Descarga: %1 KiB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s Velocidad de subida: %1 KiB/s @@ -2200,7 +2200,7 @@ Por favor cierra el otro antes. Detenida - + Are you sure you want to quit? ¿Estás seguro de que deseas salir? @@ -2263,14 +2263,14 @@ Por favor cierra el otro antes. '%1' reiniciado. - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. %1 ha terminado de descargarse. - + I/O Error i.e: Input/Output Error Error de Entrada/Salida @@ -2286,12 +2286,12 @@ Por favor cierra el otro antes. Un error ocurrió (¿disco lleno?), '%1' pausado. - + Connection Status: Estado de la conexión: - + Online En línea @@ -2327,23 +2327,23 @@ Por favor cierra el otro antes. Descargando '%1', por favor espera... - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. Un error ocurrió (¿disco lleno?), '%1' pausado. - + Search Buscar - + RSS RSS - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -2360,13 +2360,13 @@ Por favor cierra el otro antes. Soporte para DHT [encendido], puerto: %1 - - + + DHT support [OFF] Soporte para DHT [apagado] - + PeX support [ON] Soporte para PeX [encendido] @@ -2375,31 +2375,31 @@ Por favor cierra el otro antes. Soporte para PeX [apagado] - + The download list is not empty. Are you sure you want to quit qBittorrent? La lista de descargas no está vacía. ¿En verdad deseas salir de qBittorrent? - - + + Downloads Descargas - + Are you sure you want to delete the selected item(s) in finished list? ¿Estás seguro de que deseas borrar los íconos seleccionados en la lista de terminados? - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 - + UPnP support [ON] Soporte para UPnP [encendido] @@ -2408,17 +2408,17 @@ Are you sure you want to quit qBittorrent? Ten cuidado, compartir material protegido sin permiso es ilegal. - + Encryption support [ON] Soporte para encriptado [encendido] - + Encryption support [FORCED] Soporte para encriptado [forzado] - + Encryption support [OFF] Sopote para encriptado [apagado] @@ -2432,13 +2432,13 @@ Are you sure you want to quit qBittorrent? Radio - + Alt+1 shortcut to switch to first tab Alt+1 - + Alt+2 shortcut to switch to second tab Alt+2 @@ -2449,18 +2449,18 @@ Are you sure you want to quit qBittorrent? Alt+3, Ctrl+F - + Alt+4 shortcut to switch to fourth tab Alt+4 - + Url download error Error de descarga de Url - + Couldn't download file at url: %1, reason: %2. No se pudo descargar el archivo en la url: %1, razón: %2. @@ -2469,12 +2469,12 @@ Are you sure you want to quit qBittorrent? Se negaron los datos para reinicio rápido del torrent: %1, verificando de nuevo... - + Are you sure you want to delete the selected item(s) from download list and from hard drive? ¿Estás seguro de que deseas borrar los elementos seleccionados de la lista de descargas y el disco duro? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? ¿Estás seguro de que deseas borrar los elementos selccionados de la lista de terminados y el disco duro? @@ -2488,13 +2488,13 @@ Are you sure you want to quit qBittorrent? Falló la búsqueda de semilla por Url para la url: %1, mensaje: %2 - + Alt+3 shortcut to switch to third tab Alt+3 - + Ctrl+F shortcut to switch to search tab Ctrl + F @@ -2505,78 +2505,78 @@ Are you sure you want to quit qBittorrent? '%1' fue eliminado porque su radio llegó al valor máximo que estableciste. - + UPnP support [OFF] Soporte para UPnP [Apagado] - + NAT-PMP support [ON] Soporte para NAT-PMP [Encendido] - + NAT-PMP support [OFF] Soporte para NAT-PMP[Apagado] - + DHT support [ON], port: UDP/%1 - + Local Peer Discovery [ON] Descubrimiento local de Peers [Encendido] - + Local Peer Discovery support [OFF] Soporte para descubrimiento local de Peers [Apagado] - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) - - + + DL: %1 KiB/s - - + + UP: %1 KiB/s - - + + Ratio: %1 - - + + DHT: %1 nodes - - + + No direct connections. This may indicate network configuration problems. - + Uploads - + Options were saved successfully. Opciones guardadas exitosamente. @@ -3304,12 +3304,12 @@ p, li { white-space: pre-wrap; } Motor de búsqueda - + Empty search pattern Patrón de búsqueda vacío - + Please type a search pattern first Por favor escriba un patrón de búsqueda primero @@ -3322,13 +3322,13 @@ p, li { white-space: pre-wrap; } Debes seleccionar al menos un motor de búsqueda. - - + + Results Resultados - + Searching... Buscando... @@ -3371,58 +3371,58 @@ Log: Tu plugin de búsqueda vuelve a estar actualizado. - + Cut - + Copy - + Paste - + Clear field - + Clear completion history - + Search Engine Motor de Búsqueda - - + + Search has finished Búsqueda terminada - + An error occured during search... Ocurrió un error durante la búsqueda... - + Search aborted Búsqueda abortada - + Search returned no results La búsqueda no devolvió resultados - + Results i.e: Search results Resultados @@ -3436,8 +3436,8 @@ Log: No se pudo descargar la actualización del plugin de búsqueda en la url: %1, razón: %2. - - + + Unknown Desconocido @@ -3615,6 +3615,11 @@ Log: Download in sequential order (slower but good for previewing) + + + Skip file checking and start seeding immediately + + File name Nombre del archivo @@ -3632,17 +3637,17 @@ Log: Descargar por orden (mas lento pero mejor para previsualizar) - + Add to download list in paused state Agregar a la lista de descargas en estado de pausa - + Add Agregar - + Cancel Cancelar @@ -3659,22 +3664,22 @@ Log: Seleccionar - + Ignored Ignorado - + Normal Normal - + High Alta - + Maximum Máxima @@ -3744,18 +3749,18 @@ Log: bittorrent - + %1 reached the maximum ratio you set. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. '%1' fue borrado permanentemente. - + '%1' was removed. 'xxx.avi' was removed. '%1' fue removido. @@ -3771,96 +3776,96 @@ Log: '%1' reiniciado. - + '%1' is not a valid magnet URI. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. '%1' ya está en la lista de descargas. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) '%1' reiniciado. (reinicio rápido) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. '%1' agregado a la lista de descargas. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' Imposible decodificar el archivo torrent: '%1' - + This file is either corrupted or this isn't a torrent. Este archivo puede estar corrupto, o no ser un torrent. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 - + Unable to decode %1 torrent file. - + Couldn't listen on any of the given ports. No se pudo escuchar en ninguno de los puertos brindados. - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Falló el mapeo del puerto, mensaje: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Mapeo del puerto exitoso, mensaje: %1 - + Fast resume data was rejected for torrent %1, checking again... Se negaron los datos para reinicio rápido del torrent: %1, verificando de nuevo... - + Url seed lookup failed for url: %1, message: %2 Falló la búsqueda de semilla por Url para la url: %1, mensaje: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Descargando '%1', por favor espera... @@ -4193,6 +4198,125 @@ Log: Por favor escribe al menos una URL. + + downloadThread + + + + I/O Error + + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + Error desconocido + + downloading @@ -4418,12 +4542,12 @@ Log: Falso - + Uninstall warning Alerta de desinstalación - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. @@ -4432,83 +4556,83 @@ Solamente los que has agregado por tí mismo pueden ser desinstalados. De cualquier forma, esos plugins fueron deshabilitados. - + Uninstall success Éxito de desinstalación - + Select search plugins Selecciona los plugins de búsqueda - - + + qBittorrent search plugins Plugins de búsqueda de qBittorrent - - - - - - - - + + + + + + + + Search plugin install Instalar plugin de búsqueda - - - + + + Yes - - - - + + + + No - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine Una versión más reciente del plugin de motor de búsqueda %1 ya está instalada. - - - - - + + + + + Search plugin update Actualización del plugin de búsqueda - - + + Sorry, update server is temporarily unavailable. Lo siento, el servidor de actualización esta temporalmente no disponible. @@ -4518,37 +4642,37 @@ De cualquier forma, esos plugins fueron deshabilitados. Lo lamento, la actualización del plugin de búsqueda %1 ha fallado. - + All your plugins are already up to date. Todos tus plugins ya están actualizados. - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine El plugin de motor de búsqueda %1 no pudo ser actualizado, manteniendo la versión antigua. - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine El plugin de motor de búsqueda %1 no pudo ser instalado. - + All selected plugins were uninstalled successfully Todos los plugins seleccionados fueron instalados exitosamente - + %1 search engine plugin was successfully updated. %1 is the name of the search engine El plugin de motor de búsqueda %1 fue actualizado exitosamente. - + %1 search engine plugin was successfully installed. %1 is the name of the search engine El plugin de motor de búsqueda %1 fue instalado exitosamente. @@ -4559,24 +4683,24 @@ De cualquier forma, esos plugins fueron deshabilitados. El plugin de búsqueda %1 fué actualizado exitosamente. - + Search engine plugin archive could not be read. El archivo de plugin de motor de búsqueda no pudo ser leído. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine Lo lamento, la instalación del plugin de búsqueda %1 ha fallado. - + New search engine plugin URL URL del nuevo plugin de motor de búsqueda - + URL: URL: @@ -5515,29 +5639,20 @@ De cualquier forma, esos plugins fueron deshabilitados. subDownloadThread - Host is unreachable - El host no se puede alcanzar + El host no se puede alcanzar - File was not found (404) - El archivo no fue encontrado (404) + El archivo no fue encontrado (404) - Connection was denied - La conexión fue negada + La conexión fue negada - Url is invalid - La url es inválida - - - - I/O Error - + La url es inválida Connection forbidden (403) @@ -5552,29 +5667,24 @@ De cualquier forma, esos plugins fueron deshabilitados. El contenido ha sido cambiado de lugar (301) - Connection failure - Falla de conexión + Falla de conexión - Connection was timed out - El tiempo de espera para la conexión se ha agotado + El tiempo de espera para la conexión se ha agotado - Incorrect network interface - Interfaz de red incorrecta + Interfaz de red incorrecta - Unknown error - Error desconocido + Error desconocido - Could not resolve proxy - No se pudo resolver el proxy + No se pudo resolver el proxy @@ -5640,12 +5750,12 @@ De cualquier forma, esos plugins fueron deshabilitados. No se pudo crear la ruta de guardado - + Invalid file selection Selección de archivo inválida - + You must select at least one file in the torrent Debes seleccionar al menos un arcihvo en el torrent diff --git a/src/lang/qbittorrent_fi.qm b/src/lang/qbittorrent_fi.qm index 0252a0b99cc771ff06394dc3e2cbb516a20c3159..fdc647282fe4c788b7e1230e5d76a03449197d62 100644 GIT binary patch delta 2013 zcmXBVe^eCL6$kL|%+4^*{z5=dQQ4N1pGnt9;({Vj^ni$hnuy>Yz=MS(RK*%WG_W8d zkx)_bi6#}b8nIXq5W*5s)F=>RfK-t{3?Si`BH*#9v8UK*uV?<*&)MDg=DmC0y>GrM z5DIgJgVW~i0I(Qn=>$Z7pnDg&61Y-Aeg@3@GaxMiOa}o^3ys@e6ylL^9$0z?C~ybD za{%8>iq#v)CLre-5OIeF{|i`6e(eCf`^x!1bS~gMt{688m|y)K4aDvP>VE>(-vF9* zMQsM|MA5`t?m3&oxj0`~4>61;*UwdKbx|D3XHlH{;xE=fJS76HlZy9lD2`YZ$1@?G zodlW|K&+sB2bp10PeFG2LeBgna4nQIatjO#+Zup?6$ttMG_dXhLI!BBP00w|^BDLp zmCfOo&OC#NT-sswBCPsrB8|$!s6q!`i4r)%iQ?yOdP^m~4HLJ%}qb&=m& zR!GGW%-lpHe=(OuiSg!kAC+kfE$bMo3W!}ou{9_T@~WV=Wk6E5;)N-ykU09DI8U)^ zuPP=h53p=i#T<2}bXBQhx6!sl8V9;C7~n;@=~)!7(*E~N?ULMYVBTEV<}063u+wq^bsxIInCmaYJedxV_N zdng67g}qS~z+EeIl#JfD-WE#g1)%b};y|}>x~u?*(vbfkR|}^r0)d7;wpsF+*C$lG zQ3?#66RxQBz>HSmT0$hSY+PvC=>}N!LQC>>;KE-NhpJh#Wa7Uyv0o+QhT42_Eu&i5 zn50-(rr1>=CcPO#-E>miH2xNlT1ZX;f#G6G18w!{HgW5rbAZQ~xO2-bs?2gRyC@#` zu|Uk-l?1#|C+5wdioM*=3a6NSYSrSg{7-@YNX6k(Vuk7xYS^7(%{6*V;+KlmQxylh z*e_FjK@RZ!Aj+5?j`$G{+RD~ zW_fCN*9LdV{%Hm!@`>VLl;ji@4)h+7oQEl8ZJw-6ZF0WnFQqwA$rNQvX+G~$r(Tw} zmr;KE_OUq{kAzC;u!(jT0f~ajxy4pB{lA%B3Mu*^-Uk7`>I14d|pQd<{}N58vt!CJFhWtJ*-XR!rxJ| z2~8;97tH2s1NrZQnMG^#?sArGioXGBq7;8vs5oYpoi{!Os={QieSe~`CRnd_E_aFP zbcSWm6|iZzak!#=E6=WhS#iQ36$h3^ZFx1InV?NE0PsR1{WdT4(bokgeO!*({I_vP*~H(Ph_=0MHt*)-{X zx5o3glvuX^Ht67#r8L#(e;c zwlcS=M!xbx7B$t~)f%LIXYGCPkoQKrZdrQrTjoAiF8Cg z$5@=5fg5HP`h3ie+qrD$4bW{m@;e|#)>#g3qc=^SE>}JSoGsOr473Abe!6mPD)9YY zUG2y^z<68NbaN5ij`_Nd6uKR6{zlhjpqeY5uIsj^#%Q-Hj+%6nAJhDw{F$45w){7J zPCwP&!^P~pz0tltR$p6AC8e3BzvMqjt$meE*c>2kNf;&&5Rju-NOV^Su12AXM@6g@#QOx56*Q7qQbMATfCq|7QR_o1 z{=K$q>vKJ-B8XD(cCF$KRO>~pC=Y>xin4BNpJ?m;;;io5w)W-Cd@_^C_xrp4|5=$U z|7wMNb;rTdvj8Cq2wx3o7XYW53!;PdYGCL#U_}rx zd@<11EOGBuVg<1H2{7s#5={oiIhY4baPSLYQZCT#fyBfXAi;6}JTNsMI4}X2b_%G- zDX3C&9ST}|a%n7p3-m9!3`J}opnQwOi>oExZD(;@(2&wIP;5~Em1c=I`$%kjB=J!j z6g%31Q-x6Mp|~Rx;BvJcVq z6!WR?5cAPPpt^~9^F!bA!Khq{G-n{jerlkn@-TLX2;A?+?EIw86A_=k4rs7rl4%|g zvL2JxKc&3WFnK7|;+`98C^@>&;Q#9)anRoo{Fe*rfAiCeRg+A+#5v1udg zAyw+37;7Y!%#%eY(zPK}V)0Yi@a4v`I3YN6tb9-R?ZDkm^5aTca(um|#rxm|&>Me;MIlR(MO z5*xa(A|af=u#+_kI{*Fcig-p7l4_K=a;L=W&sh)Wz;4GI6|>ju0)p===2|b%_!TO0 z3X*`E&lS0gj6nA?MV=px<i*5;vPQ zic9%B`7BKt)aB4d!SjdtRGk?T>(2^4al?UHPVjG}%2a;J%9P>$-xdjWADV-L9Kjy; z0c{aFA#>*-dh8dba0xbPgtaotTLhL!foHXv^iZ7?mjCcz12cP!ePKQS7^?9pN2P+ zt#nayqgjzlAb&ZVRk_6QwWZA4b&#^U)cME~T0i$LusBy;*!6tTY2A5X-&u(@dn7)r z7CqkS4>Z?_{;5Au+K0uE{0}LQX{^Y#C)b13x~j*eh)EyQ66`l#;(kG5Wp{}+_a#2^ z6K8XEK+n^ny(OBqvC-n3ykcO9R$MS}9^igkT=asnZtl;bRWbet7Kjh!*MJYAB<@=# zv0)qAt_t#eXi)luHPAwrE462-7AIR+tty=VdIR%zoAzFWvUpIt;}sxr^$2Cj+1cr@LmGBJf@2eVdp9e*#21#}4NQnt@^ zeEcdPFIM6w(GqXhxF)2M?w9kKvBONhtc6u|7$Z(m2?}cAEfwqPq2?yBXb*MHbk$#r z{|vb7S0xR&04&?AGNk3wyC+j++&X}s-K#RMr{5=wss(E^XxM&I<%-*Y9otp;u~fm9 ziKV}$zcAc-P#*C(~d$h%bY@=#XfspH!!Sgq$E z{^D^K;1#dF(&pa0Y8P2|c5k~igtp;a_a`xl6!I-9<-bx&*Ld|SW|k)brS_9I`sMgw z3Q}N$5p$7&Oqh^P*G6Z0_rr+}&nTitSJhh($#85)DpVlo>3K)L&`l=Y;S3jNE& z_VR3^_s2J?uFiLXR#LxtP#U~qpWtbL1VGnH0j0+t2xuCnU!vxGxwF#?-+$+BD+}kR*o4@ zsQNZKEH9~n7QNAnj*!HN&PcWoYacYHMvcw?WYa6$?bh9HblOHaun aika tapahtui virhe... - - - - + + + + Are you sure? -- qBittorrent Oletko varma? — qBittorrent @@ -1537,7 +1537,7 @@ p, li { white-space: pre-wrap; } Haluatko varmasti poistaa kaikki tiedostot latauslistasta? - + Are you sure you want to delete the selected item(s) in download list? Haluatko varmasti poistaa valitut tiedostot latauslistasta? @@ -1599,7 +1599,7 @@ p, li { white-space: pre-wrap; } Latausnopeus - + Download finished Lataus valmistui @@ -1625,7 +1625,7 @@ p, li { white-space: pre-wrap; } ETA - + Finished Valmis @@ -1655,11 +1655,11 @@ p, li { white-space: pre-wrap; } Nimi - - - - - + + + + + &No &Ei @@ -1672,7 +1672,7 @@ p, li { white-space: pre-wrap; } Hakupalvelua ei ole valittu - + Open Torrent Files Avaa torrent-tiedostoja @@ -1802,7 +1802,7 @@ Uutta esikatselua ei voi aloittaa. Tiedosto ei ole kelvollinen torrent-tiedosto. - + Torrent Files Torrent-tiedostot @@ -1823,11 +1823,11 @@ Uutta esikatselua ei voi aloittaa. Lähetysnopeus: - - - - - + + + + + &Yes &Kyllä @@ -1844,15 +1844,15 @@ Uutta esikatselua ei voi aloittaa. I/O-virhe - - + + qBittorrent %1 e.g: qBittorrent v0.x qBittorrent %1 - - + + Connection status: Yhteyden tila: @@ -1905,21 +1905,21 @@ Uutta esikatselua ei voi aloittaa. Lataajia - - + + qBittorrent qBittorrent - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s Latausnopeus: %1 KiB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s Lähetysnopeus: %1 KiB/s @@ -1940,7 +1940,7 @@ Uutta esikatselua ei voi aloittaa. Seisahtunut - + Are you sure you want to quit? Haluatko varmasti poistua? @@ -1978,14 +1978,14 @@ Uutta esikatselua ei voi aloittaa. Torrentin ”%1” lataamista jatkettiin. - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. Lataus ”%1” tuli valmiiksi. - + I/O Error i.e: Input/Output Error I/O-virhe @@ -1996,12 +1996,12 @@ Uutta esikatselua ei voi aloittaa. Tiedostoon %1 kirjoittaminen tai lukeminen epäonnistui. Levy saattaa olla täynnä. Lataus pysäytettiin. - + Connection Status: Yhteyden tila: - + Online Ei verkkoyhteyttä @@ -2020,18 +2020,18 @@ Uutta esikatselua ei voi aloittaa. Tulokset - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. Tapahtui virhe (levy on täynnä?). Lataus ”%1” pysäytettiin. - + Search Etsi - + RSS RSS @@ -2045,13 +2045,13 @@ Uutta esikatselua ei voi aloittaa. DHT-tuki [PÄÄLLÄ] portissa %1 - - + + DHT support [OFF] DHT-tuki [EI PÄÄLLÄ] - + PeX support [ON] PeX-tuki [PÄÄLLÄ] @@ -2060,51 +2060,51 @@ Uutta esikatselua ei voi aloittaa. PeX-tuki [EI PÄÄLLÄ] - + The download list is not empty. Are you sure you want to quit qBittorrent? Latauslista ei ole tyhjä. Haluatko varmasti lopettaa? - - + + Downloads Lataukset - + Are you sure you want to delete the selected item(s) in finished list? Haluatko poistaa valitut kohteet listalta? - + UPnP support [ON] UPnP-tuki [PÄÄLLÄ] - + Encryption support [ON] Salaus [KÄYTÖSSÄ] - + Encryption support [FORCED] Salaus [PAKOTETTU] - + Encryption support [OFF] Salaus [EI KÄYTÖSSÄ] - + Alt+1 shortcut to switch to first tab Alt+1 - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -2113,34 +2113,34 @@ Haluatko varmasti lopettaa? Syy: %2 - + Alt+2 shortcut to switch to second tab Alt+2 - + Alt+4 shortcut to switch to fourth tab Alt+4 - + Url download error Latausvirhe - + Couldn't download file at url: %1, reason: %2. Tiedoston lataaminen osoitteesta %1 epäonnistui: %2. - + Are you sure you want to delete the selected item(s) from download list and from hard drive? Haluatko varmasti poistaa valitut tiedostot listalta ja kovalevyltä? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? Haluatko varmasti poistaa valitut tiedostot listalta ja kovalevyltä? @@ -2150,50 +2150,50 @@ Haluatko varmasti lopettaa? ”%1” poistettiin pysyvästi. - + Alt+3 shortcut to switch to third tab Alt+3 - + Ctrl+F shortcut to switch to search tab Ctrl+F - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 qBittorrent käyttää porttia: TCP/%1 - + UPnP support [OFF] UPnP-tuki [EI PÄÄLLÄ] - + NAT-PMP support [ON] NAT-PMP-tuki [PÄÄLLÄ] - + NAT-PMP support [OFF] NAT-PMP-tuki [EI PÄÄLLÄ] - + DHT support [ON], port: UDP/%1 DHT-tuki [KÄYTÖSSÄ], portti: UDP/%1 - + Local Peer Discovery [ON] Paikallinen käyttäjien löytäminen [PÄÄLLÄ] - + Local Peer Discovery support [OFF] Paikallinen käyttäjien löytäminen [EI PÄÄLLÄ] @@ -2203,48 +2203,48 @@ Haluatko varmasti lopettaa? ”%1% poistettiin, koska sen jakosuhde saavutti asettamasi enimmäisarvon. - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version qBittorrent %1 (↓ %2 KiB/s | ↑ %3 KiB/s) - - + + DL: %1 KiB/s ↓%1 KiB/s - - + + UP: %1 KiB/s ↑%1 KiB/s - - + + Ratio: %1 Suhde: %1 - - + + DHT: %1 nodes DHT: %1 solmua - - + + No direct connections. This may indicate network configuration problems. Ei suoria yhteyksiä. Tämä voi olla merkki verkko-ongelmista. - + Uploads Lähetykset - + Options were saved successfully. Asetukset tallennettiin. @@ -2905,12 +2905,12 @@ p, li { white-space: pre-wrap; } Hakupalvelu - + Empty search pattern Tyhjä hakulauseke - + Please type a search pattern first Kirjoita ensin hakulauseke @@ -2919,13 +2919,13 @@ p, li { white-space: pre-wrap; } Valitse ensin ainakin yksi hakupalvelu. - - + + Results Tulokset - + Searching... Etsitään... @@ -2960,65 +2960,65 @@ Muutoshistoria: Hakuliitännäinen on ajan tasalla. - + Cut Leikkaa - + Copy Kopioi - + Paste Liitä - + Clear field Tyhjennä kenttä - + Clear completion history Tyhjennä hakuhistoria - + Search Engine Hakupalvelu - - + + Search has finished Haku on päättynyt - + An error occured during search... Haun aikana tapahtui virhe... - + Search aborted Haku keskeytetty - + Search returned no results Haku ei palauttanut tuloksia - + Results i.e: Search results Tulokset - - + + Unknown Tuntematon @@ -3158,17 +3158,22 @@ Muutoshistoria: Lataa järjestyksessä (hitaampi, mutta mahdollistaa aikaisemman esikatselun) - + + Skip file checking and start seeding immediately + + + + Add Lisää - + Add to download list in paused state Lisää latauslistaan pysäytettynä - + Cancel Peru @@ -3212,22 +3217,22 @@ Muutoshistoria: Poista valinta - + Ignored Ei ladata - + Normal Normaali - + High Korkea - + Maximum Korkein @@ -3301,18 +3306,18 @@ Muutoshistoria: bittorrent - + %1 reached the maximum ratio you set. %1 on saavuttanut asetetun jakosuhdeluvun. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. ”%1” poistettiin pysyvästi. - + '%1' was removed. 'xxx.avi' was removed. ”%1” poistettiin. @@ -3328,96 +3333,96 @@ Muutoshistoria: Torrentin ”%1” lataamista jatkettiin. - + '%1' is not a valid magnet URI. ”%1” ei kelpaa magnet-URI:ksi. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. ”%1” on jo latauslistassa. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) Torrentin "%1” latausta jatkettiin. (nopea palautuminen) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. ”%1” lisättiin latauslistaan. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' Viallinen torrent-tiedosto: ”%1” - + This file is either corrupted or this isn't a torrent. Tiedosto ei ole kelvollinen torrent-tiedosto. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked <i>IP-suodatin on estänyt osoitteen</i> <font color='red'>%1</font> - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned <font color='red'>%1</font> <i>on estetty korruptuneiden osien takia</i> - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 Rekursiivinen tiedoston %1 lataus torrentissa %2 - + Unable to decode %1 torrent file. Torrent-tiedostoa %1 ei voitu tulkita. - + Couldn't listen on any of the given ports. Minkään annetun portin käyttäminen ei onnistunut. - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: portin varaaminen epäonnistui: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: portin varaaminen onnistui: %1 - + Fast resume data was rejected for torrent %1, checking again... Nopean jatkamisen tiedot eivät kelpaa torrentille %1. Tarkistetaan uudestaan... - + Url seed lookup failed for url: %1, message: %2 Jakajien haku osoitteesta %1 epäonnistui: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Ladataa torrenttia ”%1”. Odota... @@ -3722,6 +3727,125 @@ Muutoshistoria: Anna vähintään yksi URL-osoite. + + downloadThread + + + + I/O Error + I/O-virhe + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + Tuntematon virhe + + downloading @@ -3947,12 +4071,12 @@ Muutoshistoria: Ei - + Uninstall warning Poistovaroitus - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. @@ -3961,141 +4085,141 @@ However, those plugins were disabled. Kyseiset liitänäiset poistettiin kuitenkin käytöstä. - + Uninstall success Poisto onnistui - + Select search plugins Valitse hakuliitännäiset - - + + qBittorrent search plugins qBittorrentin hakuliitännäiset - - - - - - - - + + + + + + + + Search plugin install Hakuliitännäisen asennus - - - + + + Yes Kyllä - - - - + + + + No Ei - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine Uudempi versio hakuliitännäisestä %1 on jo asennettu. - - - - - + + + + + Search plugin update Hakuliitännäisen päivitys - - + + Sorry, update server is temporarily unavailable. Päivityspalvelin ei ole tällä hetkellä saavutettavissa. - + All your plugins are already up to date. Kaikki liitännäiset ovat ajan tasalla. - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine Hakuliitännäisen %1 päivitys epäonnistui. - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine Hakuliitännäisen %1 asennus epäonnistui. - + All selected plugins were uninstalled successfully Kaikki valitut liitännäiset poistettiin - + %1 search engine plugin was successfully updated. %1 is the name of the search engine Hakuliitännäinen %1 päivitettiin. - + %1 search engine plugin was successfully installed. %1 is the name of the search engine Hakuliitännäinen %1 asennettiin. - + Search engine plugin archive could not be read. Hakuliitännäisarkiston lukeminen epäonnistui. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine Hakuliitännäisen %1 asennus epäonnistui. - + New search engine plugin URL Uusi hakukoneliitännäisen osoite - + URL: URL: @@ -4937,54 +5061,44 @@ Kyseiset liitänäiset poistettiin kuitenkin käytöstä. subDownloadThread - Host is unreachable - Kohdekone ei ole saavutettavissa + Kohdekone ei ole saavutettavissa - File was not found (404) - Tiedostoa ei löytynyt (404) + Tiedostoa ei löytynyt (404) - Connection was denied - Yhteys evättiin + Yhteys evättiin - Url is invalid - URL ei ole kelvollinen + URL ei ole kelvollinen - Connection failure - Yhteysvirhe + Yhteysvirhe - Connection was timed out - Yhteys aikakatkaistiin + Yhteys aikakatkaistiin - Incorrect network interface - Väärä verkkoliitäntä + Väärä verkkoliitäntä - Unknown error - Tuntematon virhe + Tuntematon virhe - I/O Error - I/O-virhe + I/O-virhe - Could not resolve proxy - Välityspalvelimen osoitteen selvittäminen epäonnistui + Välityspalvelimen osoitteen selvittäminen epäonnistui @@ -5010,7 +5124,7 @@ Kyseiset liitänäiset poistettiin kuitenkin käytöstä. Ei - + Invalid file selection Virheellinen tiedostovalinta @@ -5055,7 +5169,7 @@ Kyseiset liitänäiset poistettiin kuitenkin käytöstä. Torrent-tiedoston purkaminen ei onnistunut: - + You must select at least one file in the torrent Valitse ainakin yksi torrent-tiedosto diff --git a/src/lang/qbittorrent_fr.qm b/src/lang/qbittorrent_fr.qm index 4ad01e5dcfd1f3d7e45c97cd22a2d43cc5c78e14..47d48cc80ed8eb401dd9e7bb632a78fc687c89c9 100644 GIT binary patch delta 8872 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 PwfwKT?p{!d`APPF8Wsd+ delta 5881 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 W`$EF3bA!Ue{vn?B?=VSjEB*`HRRos+ diff --git a/src/lang/qbittorrent_fr.ts b/src/lang/qbittorrent_fr.ts index a973618a8..c67ac2c46 100644 --- a/src/lang/qbittorrent_fr.ts +++ b/src/lang/qbittorrent_fr.ts @@ -787,7 +787,7 @@ Copyright © 2006 par Christophe DUMEZ<br> Disable splash screen - + Désactiver l'écran de démarrage @@ -1725,7 +1725,7 @@ Copyright © 2006 par Christophe DUMEZ<br> Super seeding mode - + Mode de partage optimal @@ -1752,7 +1752,7 @@ Copyright © 2006 par Christophe DUMEZ<br> Impossible de trouver le dossier : ' - + Open Torrent Files Ouvrir fichiers torrent @@ -1781,10 +1781,10 @@ Copyright © 2006 par Christophe DUMEZ<br> Ce fichier est corrompu ou il ne s'agit pas d'un torrent. - - - - + + + + Are you sure? -- qBittorrent Etes vous sûr ? -- qBittorrent @@ -1793,25 +1793,25 @@ Copyright © 2006 par Christophe DUMEZ<br> Etes-vous sûr de vouloir enlever tous les fichiers de la liste de téléchargement ? - - - - - + + + + + &Yes &Oui - - - - - + + + + + &No &Non - + Are you sure you want to delete the selected item(s) in download list? Etes-vous sûr de vouloir enlever tous les fichiers sélectionnés de la liste de téléchargement ? @@ -1832,7 +1832,7 @@ Copyright © 2006 par Christophe DUMEZ<br> ko/s - + Finished Terminé @@ -1877,7 +1877,7 @@ Copyright © 2006 par Christophe DUMEZ<br> Impossible de créer le dossier : - + Torrent Files Fichiers Torrent @@ -2217,7 +2217,7 @@ Veuillez d'abord le quitter. Transferts - + Download finished Téléchargement terminé @@ -2239,15 +2239,15 @@ Veuillez d'abord le quitter. Etes-vous certain de vouloir supprimer les fichiers sélectionnés depuis la liste de téléchargement ainsi que le disque dur ? - - + + qBittorrent %1 e.g: qBittorrent v0.x qBittorrent %1 - - + + Connection status: Statut de la connexion : @@ -2310,21 +2310,21 @@ Veuillez d'abord le quitter. qBittorrent %1 démarré. - - + + qBittorrent qBittorrent - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s Vitesse DL : %1 Ko/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s Vitesse UP : %1 Ko/s @@ -2345,7 +2345,7 @@ Veuillez d'abord le quitter. En attente - + Are you sure you want to quit? Etes vous certain de vouloir quitter ? @@ -2408,14 +2408,14 @@ Veuillez d'abord le quitter. '%1' a été relancé. - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. Le téléchargement de %1 est terminé. - + I/O Error i.e: Input/Output Error Erreur E/S @@ -2431,12 +2431,12 @@ Veuillez d'abord le quitter. Une erreur s'est produite (disque plein ?), '%1' a été mis en pause. - + Connection Status: Etat de la connexion : - + Online Connecté @@ -2472,23 +2472,23 @@ Veuillez d'abord le quitter. Téléchargement de '%1', veuillez patienter... - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. Une erreur s'est produite (disque plein ?), '%1' a été mis en pause. - + Search Recherche - + RSS - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -2506,13 +2506,13 @@ Raison : %2 Support DHT [ON], port : %1 - - + + DHT support [OFF] Support DHT [OFF] - + PeX support [ON] Support PeX [ON] @@ -2521,15 +2521,15 @@ Raison : %2 Support PeX [OFF] - + The download list is not empty. Are you sure you want to quit qBittorrent? La liste de téléchargement n'est pas vide. Etes-vous certain de vouloir quitter qBittorrent ? - - + + Downloads Téléchargements @@ -2538,12 +2538,12 @@ Etes-vous certain de vouloir quitter qBittorrent ? Etes-vous certain de vouloir supprimer les torrents sélectionnés dans la liste de partage et sur le disque dur ? - + Are you sure you want to delete the selected item(s) in finished list? Etes-vous certain de vouloir supprimer les torrents sélectionnés de la liste de partage ? - + UPnP support [ON] Support UPnP [ON] @@ -2552,17 +2552,17 @@ Etes-vous certain de vouloir quitter qBittorrent ? Attention, partager des oeuvres sous copyright sans en avoir la permission est illégal. - + Encryption support [ON] Support cryptage [ON] - + Encryption support [FORCED] Support cryptage [Forcé] - + Encryption support [OFF] Support cryptage [OFF] @@ -2576,13 +2576,13 @@ Etes-vous certain de vouloir quitter qBittorrent ? Ratio - + Alt+1 shortcut to switch to first tab Alt+& - + Alt+2 shortcut to switch to second tab Alt+é @@ -2593,18 +2593,18 @@ Etes-vous certain de vouloir quitter qBittorrent ? Qt::CTRL+Qt::Key_F, Qt::Alt+Qt::Key_QuoteDbl - + Alt+4 shortcut to switch to fourth tab Alt+' - + Url download error Erreur téléchargement url - + Couldn't download file at url: %1, reason: %2. Impossible de télécharger le fichier à l'url : %1, raison : %2. @@ -2613,12 +2613,12 @@ Etes-vous certain de vouloir quitter qBittorrent ? Le relancement rapide a échoué pour le torrent %1, revérification... - + Are you sure you want to delete the selected item(s) from download list and from hard drive? Etes-vous certain de vouloir supprimer les fichiers sélectionnés depuis la liste de téléchargement ainsi que le disque dur ? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? Etes-vous certain de vouloir supprimer les torrents sélectionnés dans la liste de partage et sur le disque dur ? @@ -2632,50 +2632,50 @@ Etes-vous certain de vouloir quitter qBittorrent ? Le contact de la source HTTP a échoué à l'url : %1, message : %2 - + Alt+3 shortcut to switch to third tab Alt+" - + Ctrl+F shortcut to switch to search tab - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 qBittorrent écoute sur le port : TCP/%1 - + UPnP support [OFF] Support UPNP [OFF] - + NAT-PMP support [ON] Support NAT-PMP [ON] - + NAT-PMP support [OFF] Support NAT-PMP [OFF] - + DHT support [ON], port: UDP/%1 Support DHT [ON], port : UDP/%1 - + Local Peer Discovery [ON] Découverte locale de sources [ON] - + Local Peer Discovery support [OFF] Découverte locale de sources [OFF] @@ -2685,48 +2685,48 @@ Etes-vous certain de vouloir quitter qBittorrent ? '%1' a été supprimé car son ratio a atteint la limite que vous avez fixée. - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version qBittorrent %1 (DL: %2Ko/s, UP: %3Ko/s) - - + + DL: %1 KiB/s R : %1 Ko/s - - + + UP: %1 KiB/s E : %1 Ko/s - - + + Ratio: %1 Ratio : %1 - - + + DHT: %1 nodes DHT : %1 noeuds - - + + No direct connections. This may indicate network configuration problems. Aucune connexion directe. Ceci peut être signe d'une mauvaise configuration réseau. - + Uploads Partages - + Options were saved successfully. Préférences sauvegardées avec succès. @@ -3474,12 +3474,12 @@ p, li { white-space: pre-wrap; } Moteur de recherche - + Empty search pattern Motif de recherche vide - + Please type a search pattern first Veuillez entrer un motif de recherche d'abord @@ -3492,13 +3492,13 @@ p, li { white-space: pre-wrap; } Vous devez sélectionner au moins un moteur de recherche. - - + + Results Résultats - + Searching... Recherche en cours... @@ -3541,58 +3541,58 @@ Changements: Votre greffon de recherche est déjà à jour. - + Cut Couper - + Copy Copier - + Paste Coller - + Clear field Vider le champ - + Clear completion history Vider l'historique d'autocomplétion - + Search Engine Moteur de recherche - - + + Search has finished Fin de la recherche - + An error occured during search... Une erreur s'est produite lors de la recherche... - + Search aborted La recherche a été interrompue - + Search returned no results La recherche n'a retourné aucun résultat - + Results i.e: Search results Résultats @@ -3606,8 +3606,8 @@ Changements: Impossible de télécharger la mise à jour du greffon de recherche à l'url : %1, raison : %2. - - + + Unknown Inconnu @@ -3781,6 +3781,11 @@ Changements: Download in sequential order (slower but good for previewing) Téléchargement séquentiel (plus lent mais facilite la prévisualisation) + + + Skip file checking and start seeding immediately + Ne pas vérifier les fichiers et commencer directement à partager + File name Nom @@ -3798,17 +3803,17 @@ Changements: Télécharger dans l'ordre (plus lent mais idéal pour la prévisualisation) - + Add to download list in paused state Ajouter à la liste de téléchargement en état de pause - + Add Ajouter - + Cancel Annuler @@ -3825,22 +3830,22 @@ Changements: Sélectionner - + Ignored Ignoré - + Normal Normale - + High Haute - + Maximum Maximale @@ -3914,18 +3919,18 @@ Changements: bittorrent - + %1 reached the maximum ratio you set. %1 a atteint le ratio maximum défini. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. '%1' a été supprimé de manière permanente. - + '%1' was removed. 'xxx.avi' was removed. '%1' a été supprimé. @@ -3941,96 +3946,96 @@ Changements: '%1' a été relancé. - + '%1' is not a valid magnet URI. '%1' n'est pas un lien magnet valide. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. '%1' est déjà présent dans la liste de téléchargement. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) '%1' a été relancé. (relancement rapide) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. '%1' a été ajouté à la liste de téléchargement. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' Impossible de décoder le torrent : '%1' - + This file is either corrupted or this isn't a torrent. Ce fichier est corrompu ou il ne s'agit pas d'un torrent. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked <font color='red'>%1</font> <i>a été bloqué par votre filtrage IP</i> - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned <font color='red'>%1</font> <i>a été banni suite à l'envoi de données corrompues</i> - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 Téléchargement récursif du fichier %1 au sein du torrent %2 - + Unable to decode %1 torrent file. Impossible de décoder le torrent %1. - + Couldn't listen on any of the given ports. Impossible d'écouter sur les ports donnés. - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP : Echec de mapping du port, message : %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP : Réussite du mapping de port, message : %1 - + Fast resume data was rejected for torrent %1, checking again... Le relancement rapide a échoué pour le torrent %1, revérification... - + Url seed lookup failed for url: %1, message: %2 Le contact de la source HTTP a échoué à l'url : %1, message : %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Téléchargement de '%1', veuillez patienter... @@ -4379,6 +4384,125 @@ Changements: Veuillez entrer au moins une URL. + + downloadThread + + + + I/O Error + Erreur E/S + + + + The remote host name was not found (invalid hostname) + Hôte distant introuvable (Nom d'hôte invalide) + + + + The operation was canceled + Opération annulée + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + Connexion fermée prématurément par le serveur distant, avant la réception complète de sa réponse + + + + The connection to the remote server timed out + Délai de connexion au serveur distant écoulée + + + + SSL/TLS handshake failed + Erreur poignée de main SSL/TLS + + + + The remote server refused the connection + Connexion refusée par le serveur distant + + + + The connection to the proxy server was refused + Connexion refusée par le serveur mandataire + + + + The proxy server closed the connection prematurely + Connexion fermée prématurément par le serveur mandataire + + + + The proxy host name was not found + Nom d'hôte du serveur mandataire introuvable + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + Délai de connexion au serveur mandataire écoulée + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + Echec d'authentification auprès du serveur mandataire + + + + The access to the remote content was denied (401) + Accès au contenu distant refusé (401) + + + + The operation requested on the remote content is not permitted + L'opération sur le contenu distant n'est pas permise + + + + The remote content was not found at the server (404) + Contenu distant introuvable (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + Echec d'authentification avec le serveur distant + + + + The Network Access API cannot honor the request because the protocol is not known + Protocole inconnu + + + + The requested operation is invalid for this protocol + Opération invalide pour ce protocole + + + + An unknown network-related error was detected + Erreur inconnue relative au réseau + + + + An unknown proxy-related error was detected + Erreur inconnue relative au serveur mandataire + + + + An unknown error related to the remote content was detected + Erreur inconnue relative au serveur distant + + + + A breakdown in protocol was detected + Erreur du protocole + + + + Unknown error + Erreur inconnue + + downloading @@ -4604,12 +4728,12 @@ Changements: Non - + Uninstall warning Désinstallation - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. @@ -4618,7 +4742,7 @@ However, those plugins were disabled. Cependant, les greffons en question ont été désactivés. - + Uninstall success Désinstallation réussie @@ -4627,62 +4751,62 @@ Cependant, les greffons en question ont été désactivés. Tous les greffons sélectionnés ont été désinstallés avec succès - + Select search plugins Sélectionnez les greffons - - + + qBittorrent search plugins Greffons de recherche de qBittorrent - - - - - - - - + + + + + + + + Search plugin install Installation d'un greffon de recherche - - - + + + Yes Oui - - - - + + + + No Non - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine Une version plus récente du greffon %1 est déjà installée. @@ -4698,17 +4822,17 @@ Cependant, les greffons en question ont été désactivés. Le greffon %1 a été installé avec succès. - - - - - + + + + + Search plugin update Mise à jour du greffon de recherche - - + + Sorry, update server is temporarily unavailable. Désolé, le serveur de mise à jour est temporairement indisponible. @@ -4723,37 +4847,37 @@ Cependant, les greffons en question ont été désactivés. Désolé, la mise à jour du greffon %1 a échoué. - + All your plugins are already up to date. Tous vos greffons de recherche sont déjà à jour. - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine Le greffon de recherche %1 n'a pas pu être mis à jour, l'ancienne version est conservée. - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine Le greffon de recherche %1 n'a pas pu être installé. - + All selected plugins were uninstalled successfully Tous les greffons sélectionnés ont été désinstallés avec succès - + %1 search engine plugin was successfully updated. %1 is the name of the search engine Le greffon %1 a été mis à jour avec succès. - + %1 search engine plugin was successfully installed. %1 is the name of the search engine Le greffon %1 a été installé avec succès. @@ -4764,24 +4888,24 @@ Cependant, les greffons en question ont été désactivés. Le greffon %1 a été mis à jour avec succès. - + Search engine plugin archive could not be read. L'archive contenant le greffon de recherche n'a pas pu être lue. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine Désolé, l'installation du greffon de recherche %1 a échouée. - + New search engine plugin URL Adresse du nouveau greffon de recherche - + URL: Adresse : @@ -5712,29 +5836,24 @@ Cependant, les greffons en question ont été désactivés. subDownloadThread - Host is unreachable - L'hôte distant est injoignable + L'hôte distant est injoignable - File was not found (404) - Fichier non trouvé (404) + Fichier non trouvé (404) - Connection was denied - Connexion refusée + Connexion refusée - Url is invalid - Url invalide + Url invalide - I/O Error - Erreur E/S + Erreur E/S Connection forbidden (403) @@ -5749,29 +5868,24 @@ Cependant, les greffons en question ont été désactivés. Le contenu a été déplacé (301) - Connection failure - Echec de la connexion + Echec de la connexion - Connection was timed out - Délai de connexion dépassé + Délai de connexion dépassé - Incorrect network interface - Interface réseau incorrecte + Interface réseau incorrecte - Unknown error - Erreur inconnue + Erreur inconnue - Could not resolve proxy - Impossible de résoudre le nom du serveur mandataire + Impossible de résoudre le nom du serveur mandataire @@ -5837,12 +5951,12 @@ Cependant, les greffons en question ont été désactivés. Impossible de créer le répertoire de destination - + Invalid file selection Sélection de fichiers invalide - + You must select at least one file in the torrent Veuillez sélectionner au moins un fichier dans le torrent diff --git a/src/lang/qbittorrent_hu.qm b/src/lang/qbittorrent_hu.qm index 6dbd7ba97601cec264d95efcb4c92778f95e625c..bd860f11a5669f99abe25ec98eed5946aafad159 100644 GIT binary patch delta 1986 zcmXBVc~BHr9tZGmcTdyw3^O>x6^O!;$f=GIiz9#%MLWYwEY;sa^R{ZAo>A6C6ey~|6E(Lz=mrn33AzV5ePXA?7I(y?gBhh6szWtSAm_^ zf$(lx;Voe8E8heD_{xuf^#y?2WyRRlK+LP(j{vd7K;1rIV=Hhap`^=!n<$wy@;|89 z9M0aZdKSc$p1`+1DRzb^j=atyIhSS6A^u$iI;R!;vK7Y+iW9#;{Avnl*$uIR&b?$c zOzJ73?g+>^TY#n>*2KMSx~5 zqWuu@l?*(5pJnjtZ9hj;@n^uuajf5#4Y-m={!4)-u}R+E{d_i}i)MgP0Ws$e14(xj zYu;2G^GD2!9EyK6^Az5dC(z{D2DCS@{etrwqw#pqLWx@1kH?K40P}6}>o;`hf@7Ha z&KJ0~kM#)Ni)OghJ#PT342scdiskpXgL(f0jx}?i9;MQRg(;4;vLz}9xrDnAMr9tY zVTmeZ{>_cth}$tB|95WU>^k6XC^xg?HlUx)o2FR-S?Rpl;yl3k8*l9z1N1H6oz~m| ze3E$oDkBis&j)zeQ>Wze0qyR<<2U)0PbUF~Bt9mEw(<5;3_HnZX{egFA{2if=67!j zfCg)__`T=$1Fgl(Ni_2H&MZ=lkGbw5c%{;|R<8+5Vgo70BE{iTLO|ClAR$b#>XHx? zN6(up6f55mqVo!YoCqQMb35RgsSuk^$8zr$V#n+0xr=E{LL7^PLxu+6heg7XSIt^x zBAl4m4Fu!}W$~1;hgz0l62KL)IuoNugRg2s5JlS1tBP4W0+gOrrRV$x+%#9^OP7I5 zYgN0x93UrDdm}4=AFnYhX`$OG)roo)P?4xOoUHodToKJg1NjZGPOJK&VkvO3l>J$9 zkxNw-^UnYeRZPuV7k|tt zr$DYSPua^*6J=tzh8nm3Uy5VNELV1rhfD%n?gH00vomrO-x|tZ%6qvsR;YGyY?BPn zc2L^N6o;Ql){&vWy&TEzAtmVhd8|wAZTm>du%_-fcv{NvNTSO_FJ+#iWDbO|IT~km zhbSEuD3Z3@EL>x=tXKN-_ic2`ypXExX{l^ZI?prU{Ge1DNAVANN=-YdzTUagkj*F% zwL==6uA^DZlEz{h0kc9@sj=sq-)3FJEgLqe3FZfM%+qWsea~NsC71s?^0WP zjL{;;)vnhl)aC(ZrSsyud|9|Io*&9#l{y=@gX#;J^q-+Rb^V2tz__EjXG{&uJ)|Bx zu#z%AtoSIIP3pWk#+=Mu+?ZzeYUep0#Pk`e7uY z*XABhryl9k7RaZ8)0Wy3BR7FyJ8ikyN5Gv>ZSA8Cz=AaG)ee8U__k_qr_jaMmZa@< zpdMq;_8DjpuAfqT)TEvIE4@GTlsOsl)Pv!=UBlFC5AU-|gV9jO>1xZVsWfwSm;9#a z0el~JJUYqx`foMl delta 2840 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 aA=+%Pm8CbPY7F}S`s;W0Droq*N&X+W#dXjC diff --git a/src/lang/qbittorrent_hu.ts b/src/lang/qbittorrent_hu.ts index 32a7c8617..5ba613d9b 100644 --- a/src/lang/qbittorrent_hu.ts +++ b/src/lang/qbittorrent_hu.ts @@ -1552,7 +1552,7 @@ Copyright © 2006 by Christophe Dumez<br> GUI - + Open Torrent Files Torrent fájl megnyitása @@ -1561,25 +1561,25 @@ Copyright © 2006 by Christophe Dumez<br> Ez a fájl sérült, vagy nem is torrent. - - - - - + + + + + &Yes &Igen - - - - - + + + + + &No &Nem - + Are you sure you want to delete the selected item(s) in download list? Biztos vagy benne, hogy törlöd a felsorlolt elemeket a letöltési listáról? @@ -1592,15 +1592,15 @@ Copyright © 2006 by Christophe Dumez<br> Letöltés... - + Torrent Files Torrentek - - - - + + + + Are you sure? -- qBittorrent Egészen biztos? -- qBittorrent @@ -1627,7 +1627,7 @@ Please close the other one first. Kérlek előbb azt zárd be. - + Download finished Letöltés elkészült @@ -1636,15 +1636,15 @@ Kérlek előbb azt zárd be. Egészen biztos vagy benne, hogy törlöd a felsorlolt elemeket a letöltési listáról ÉS a merevlemezről? - - + + qBittorrent %1 e.g: qBittorrent v0.x qBittorrent %1 - - + + Connection status: Kapcsolat állapota: @@ -1697,21 +1697,21 @@ Kérlek előbb azt zárd be. qBittorrent %1 elindítva. - - + + qBittorrent qBittorrent - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s Letöltés: %1 KiB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s Feltöltés: %1 KiB/s @@ -1727,7 +1727,7 @@ Kérlek előbb azt zárd be. Elakadt - + Are you sure you want to quit? Egészen biztos, hogy kilépsz? @@ -1785,14 +1785,14 @@ Kérlek előbb azt zárd be. '%1' elindítva. - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. %1 letöltve. - + I/O Error i.e: Input/Output Error I/O Hiba @@ -1803,12 +1803,12 @@ Kérlek előbb azt zárd be. Hiba történ a(z) %1 írása/olvasása közben. Valószínűleg tele a lemez, így a letöltés megszakítva - + Connection Status: A kapcsolat állapota: - + Online Online @@ -1827,23 +1827,23 @@ Kérlek előbb azt zárd be. Letöltés alatt: '%1', kis türelmet... - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. Hiba történt (megtelt a merevlemez?), '%1' megállítva. - + Search Keresés - + RSS RSS - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -1860,13 +1860,13 @@ Kérlek előbb azt zárd be. DHT funkció [ON], port: %1 - - + + DHT support [OFF] DHT funkció [OFF] - + PeX support [ON] PeX [ON] @@ -1875,20 +1875,20 @@ Kérlek előbb azt zárd be. PeX [OFF] - + The download list is not empty. Are you sure you want to quit qBittorrent? Letöltés folyamatban. Mégis leállítod a qBittorrentet? - - + + Downloads Letöltések - + Finished Feltöltések @@ -1897,12 +1897,12 @@ Mégis leállítod a qBittorrentet? Egészen biztos vagy benne, hogy törlöd a felsorolt elemeket a feltöltési listáról ÉS a merevlemezről? - + Are you sure you want to delete the selected item(s) in finished list? Biztos vagy benne, hogy törlöd a felsorolt elemeket a feltöltési listáról? - + UPnP support [ON] UPnP támogatás [ON] @@ -1911,17 +1911,17 @@ Mégis leállítod a qBittorrentet? Csak óvatosan a megosztással. Nehogy megsértsd a szerzői jogokat!. - + Encryption support [ON] Titkosítás [ON] - + Encryption support [FORCED] Titkosítás [KÉNYSZERÍTVE] - + Encryption support [OFF] Titkosítás [OFF] @@ -1935,13 +1935,13 @@ Mégis leállítod a qBittorrentet? Arány - + Alt+1 shortcut to switch to first tab Alt+1 - + Alt+2 shortcut to switch to second tab Alt+2 @@ -1952,18 +1952,18 @@ Mégis leállítod a qBittorrentet? Alt+3, Ctrl+F - + Alt+4 shortcut to switch to fourth tab Alt+4 - + Url download error Url letöltés hiba - + Couldn't download file at url: %1, reason: %2. Nem sikerült letölteni url címről: %1, mert: %2. @@ -1972,12 +1972,12 @@ Mégis leállítod a qBittorrentet? Hibás ellenőrző adat ennél a torrentnél: %1, újraellenőrzés... - + Are you sure you want to delete the selected item(s) from download list and from hard drive? Egészen biztos vagy benne, hogy törlöd a felsorlolt elemeket a letöltési listáról ÉS a merevlemezről? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? Egészen biztos vagy benne, hogy törlöd a felsorlolt elemeket a feltöltési listáról ÉS a merevlemezről? @@ -1991,50 +1991,50 @@ Mégis leállítod a qBittorrentet? Url forrás meghatározása sikertelen: %1, hibaüzenet: %2 - + Alt+3 shortcut to switch to third tab Alt+3 - + Ctrl+F shortcut to switch to search tab Ctrl+F - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 qBittorrent ezen a porton figyel: TCP/%1 - + UPnP support [OFF] UPnP támogatás [OFF] - + NAT-PMP support [ON] NAT-PMP támogatás [ON] - + NAT-PMP support [OFF] NAT-PMP támogatás [OFF] - + DHT support [ON], port: UDP/%1 DHT támogatás [ON], port: UDP/%1 - + Local Peer Discovery [ON] Local Peer Discovery [ON] - + Local Peer Discovery support [OFF] Local Peer Discovery támogatás [OFF] @@ -2044,48 +2044,48 @@ Mégis leállítod a qBittorrentet? '%1' eltávolítva, mivel elérte a kítűzött megosztási arányt. - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version qBittorrent %1 (Le: %2KiB/s, Fel: %3KiB/s) - - + + DL: %1 KiB/s Le: %1 KiB/s - - + + UP: %1 KiB/s Fel: %1 KiB/s - - + + Ratio: %1 Arány: %1 - - + + DHT: %1 nodes DHT: %1 csomó - - + + No direct connections. This may indicate network configuration problems. Nincsenek kapcsolatok. Ez lehet hálózat beállítási hiba miatt is. - + Uploads Feltöltések - + Options were saved successfully. Beállítások sikeresen elmentve. @@ -2706,12 +2706,12 @@ p, li { white-space: pre-wrap; } Kereső oldal - + Empty search pattern Hiányzó kulcsszó - + Please type a search pattern first Kérlek adj meg kulcsszót a kereséshez @@ -2724,13 +2724,13 @@ p, li { white-space: pre-wrap; } Válassz legalább egy keresőt. - - + + Results Eredmény - + Searching... Keresés... @@ -2773,58 +2773,58 @@ Changelog: A legújabb keresőt használod. - + Cut Kivágás - + Copy Másolás - + Paste Beillesztés - + Clear field Mező törlése - + Clear completion history Előzmények törlése - + Search Engine Keresőmotor - - + + Search has finished A keresés befejeződött - + An error occured during search... Hiba a keresés közben... - + Search aborted Keresés félbeszakítva - + Search returned no results Eredménytelen keresés - + Results i.e: Search results Találat @@ -2838,8 +2838,8 @@ Changelog: Nem sikerült kereső modult letölteni innen: %1, mert: %2. - - + + Unknown Ismeretlen @@ -2950,42 +2950,47 @@ Changelog: Download in sequential order (slower but good for previewing) Letöltés sorrendben (lassabb, de előnézethez ideális) + + + Skip file checking and start seeding immediately + + Download in correct order (slower but good for previewing) Letöltés sorrendben. Előnézethez kiváló, de lassabb a letöltés - + Add to download list in paused state Letöltés nélkül add a listához - + Add Mehet - + Cancel Mégse - + Ignored Mellőzve - + Normal Átlagos - + High Magas - + Maximum Maximális @@ -3059,18 +3064,18 @@ Changelog: bittorrent - + %1 reached the maximum ratio you set. %1 elérte a megengedett arányt. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. '%1' véglegesen törölve. - + '%1' was removed. 'xxx.avi' was removed. '%1' eltávolítva. @@ -3086,96 +3091,96 @@ Changelog: '%1' elindítva. - + '%1' is not a valid magnet URI. '%1' nem hiteles magnet URI. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. '%1' már letöltés alatt. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) '%1' visszaállítva. (folytatás) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. '%1' felvéve a letöltési listára. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' Megfejthetetlen torrent: '%1' - + This file is either corrupted or this isn't a torrent. Ez a fájl sérült, vagy nem is torrent. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked <font color='red'>%1</font> <i>letiltva IP szűrés miatt</i> - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned <font color='red'>%1</font> <i>kitiltva hibás adatküldés miatt</i> - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 Fájl ismételt letöltése %1 beágyazva a torrent %2 - + Unable to decode %1 torrent file. Megfejthetetlen torrent: %1. - + Couldn't listen on any of the given ports. A megadott porok zártak. - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Port felderítése sikertelen, hibaüzenet: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Port felderítése sikeres, hibaüzenet: %1 - + Fast resume data was rejected for torrent %1, checking again... Hibás ellenőrző adat ennél a torrentnél: %1, újraellenőrzés... - + Url seed lookup failed for url: %1, message: %2 Url forrás meghatározása sikertelen: %1, hibaüzenet: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Letöltés alatt: '%1', kis türelmet... @@ -3460,6 +3465,125 @@ Changelog: Kérlek adj meg legalább egy url címet. + + downloadThread + + + + I/O Error + I/O Hiba + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + Ismeretlen hiba + + downloading @@ -3685,12 +3809,12 @@ Changelog: Tiltva - + Uninstall warning Figyelemeztetés - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. @@ -3699,83 +3823,83 @@ However, those plugins were disabled. Viszont azok a modulok kikapcsolhatóak. - + Uninstall success Sikeresen eltávolítva - + Select search plugins Modul kiválasztása - - + + qBittorrent search plugins qBittorrent kereső modulok - - - - - - - - + + + + + + + + Search plugin install Kerső telepítése - - - + + + Yes Igen - - - - + + + + No Nem - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine A %1 kereső modul egy újabb verziója már telepítve van. - - - - - + + + + + Search plugin update Kereső modul frissítése - - + + Sorry, update server is temporarily unavailable. A kiszolgálő jelenleg nem elérhető. Bocs. @@ -3785,37 +3909,37 @@ Viszont azok a modulok kikapcsolhatóak. Bocs, nem sikerült frissíteni: %1. - + All your plugins are already up to date. A legújabb kereső modulokat használod. - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine %1 keresőt nem lehet frissíteni, előző verzió megtartva. - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine %1 kereső modul telepítése sikertelen. - + All selected plugins were uninstalled successfully Kereső modul(ok) sikeresen eltávolítva - + %1 search engine plugin was successfully updated. %1 is the name of the search engine %1 kereső modul sikeresen frissítve. - + %1 search engine plugin was successfully installed. %1 is the name of the search engine %1 kereső modul sikeresen telepítve. @@ -3826,24 +3950,24 @@ Viszont azok a modulok kikapcsolhatóak. %1 kereső modul sikeresen frissítve. - + Search engine plugin archive could not be read. Kereső modul beolvasása sikertelen. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine Bocs, %1 kereső modul telepítése sikertelen. - + New search engine plugin URL Új kereső modul címe - + URL: URL: @@ -4557,29 +4681,24 @@ Viszont azok a modulok kikapcsolhatóak. subDownloadThread - Host is unreachable - Kiszolgáló nem elérhető + Kiszolgáló nem elérhető - File was not found (404) - Fájl nem található (404) + Fájl nem található (404) - Connection was denied - Hozzáférés megtagadva + Hozzáférés megtagadva - Url is invalid - Érvénytelen cím + Érvénytelen cím - I/O Error - I/O Hiba + I/O Hiba Connection forbidden (403) @@ -4594,29 +4713,24 @@ Viszont azok a modulok kikapcsolhatóak. Tartalom áthelyezve (301) - Connection failure - Kapcsolódás sikertelen + Kapcsolódás sikertelen - Connection was timed out - Idő túllépés + Idő túllépés - Incorrect network interface - Hibás hálózati csatlakozó + Hibás hálózati csatlakozó - Unknown error - Ismeretlen hiba + Ismeretlen hiba - Could not resolve proxy - Nem sikerült csatlakozni a proxy-hoz + Nem sikerült csatlakozni a proxy-hoz @@ -4674,12 +4788,12 @@ Viszont azok a modulok kikapcsolhatóak. Nem sikerült létrehozni a letöltési könyvtárat. (Írásvédett?) - + Invalid file selection Választás hiánya - + You must select at least one file in the torrent Legalább egy fájlt ki kell választanod diff --git a/src/lang/qbittorrent_it.qm b/src/lang/qbittorrent_it.qm index fa0d8c518330576864e63b1c997058712cc6ef5f..0bc9a912bd71aadb4839b73c4df7a60cad37dda6 100644 GIT binary patch delta 1943 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 I!%3p}4>i6}P5=M^ diff --git a/src/lang/qbittorrent_it.ts b/src/lang/qbittorrent_it.ts index 859d68e6e..0080ee550 100644 --- a/src/lang/qbittorrent_it.ts +++ b/src/lang/qbittorrent_it.ts @@ -1593,7 +1593,7 @@ Copyright © 2006 by Christophe Dumez<br> GUI - + Open Torrent Files Apri file torrent @@ -1606,30 +1606,30 @@ Copyright © 2006 by Christophe Dumez<br> Sei sicuro di voler cancellare tutti i file nella lista di download? - - - - - + + + + + &Yes &Sì - - - - - + + + + + &No &No - + Are you sure you want to delete the selected item(s) in download list? Sei sicuro di voler cancellare gli elementi selezionati dalla lista dei download? - + Finished In Upload @@ -1670,7 +1670,7 @@ Copyright © 2006 by Christophe Dumez<br> Impossibile creare la directory: - + Torrent Files File torrent @@ -1715,10 +1715,10 @@ Copyright © 2006 by Christophe Dumez<br> qBittorrent - - - - + + + + Are you sure? -- qBittorrent Sei sicuro? -- qBittorrent @@ -1912,7 +1912,7 @@ Example: Downloading www.example.com/test.torrent Downloading - + Download finished Download completato @@ -1938,15 +1938,15 @@ Example: Downloading www.example.com/test.torrent Errore I/O - - + + qBittorrent %1 e.g: qBittorrent v0.x qBittorrent %1 - - + + Connection status: Stato della connessione: @@ -2009,21 +2009,21 @@ Example: Downloading www.example.com/test.torrent qBittorrent %1 avviato. - - + + qBittorrent qBittorrent - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s Velocità DL: %1 KiB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s Velocità UP: %1 KiB/s @@ -2044,7 +2044,7 @@ Example: Downloading www.example.com/test.torrent In Stallo - + Are you sure you want to quit? Sei sicuro di voler uscire? @@ -2107,14 +2107,14 @@ Example: Downloading www.example.com/test.torrent '%1' ripreso. - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. %1 è stato scaricato. - + I/O Error i.e: Input/Output Error Errore I/O @@ -2125,12 +2125,12 @@ Example: Downloading www.example.com/test.torrent Errore di scrittura o di lettura con %1. Probabilmente il disco è pieno, il download è stato fermato - + Connection Status: Stato della connessione: - + Online Online @@ -2166,23 +2166,23 @@ Example: Downloading www.example.com/test.torrent Download di '%1' in corso... - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. Si è verificato un errore (disco pieno?), '%1' fermato. - + Search Ricerca - + RSS RSS - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -2200,13 +2200,13 @@ Motivo: %2 Supporto DHT [ON], porta: %1 - - + + DHT support [OFF] Supporto DHT [OFF] - + PeX support [ON] Supporto PeX [ON] @@ -2215,25 +2215,25 @@ Motivo: %2 Supporto PeX [OFF] - + The download list is not empty. Are you sure you want to quit qBittorrent? La lista dei download non è vuota. Sei sicuro di voler uscire da qBittorrent? - - + + Downloads In Download - + Are you sure you want to delete the selected item(s) in finished list? Sei sicuro di voler cancellare gli elementi selezionati dalla lista dei download completati? - + UPnP support [ON] Supporto UPnP [ON] @@ -2242,17 +2242,17 @@ Sei sicuro di voler uscire da qBittorrent? Attenzione, condividere materiale protetto da copyright senza il permesso è illegale. - + Encryption support [ON] Supporto cifratura [ON] - + Encryption support [FORCED] Supporto cifratura [FORZATO] - + Encryption support [OFF] Supporto cifratura [OFF] @@ -2266,13 +2266,13 @@ Sei sicuro di voler uscire da qBittorrent? Rapporto - + Alt+1 shortcut to switch to first tab Alt+1 - + Alt+2 shortcut to switch to second tab Alt+2 @@ -2283,18 +2283,18 @@ Sei sicuro di voler uscire da qBittorrent? Alt+3, Ctrl+F - + Alt+4 shortcut to switch to fourth tab Alt+4 - + Url download error Errore download da indirizzo web - + Couldn't download file at url: %1, reason: %2. Impossibile scaricare il file all'indirizzo: %1, motivo: %2. @@ -2303,12 +2303,12 @@ Sei sicuro di voler uscire da qBittorrent? Il recupero veloce del torrent %1 è stato rifiutato, altro tentativo in corso... - + Are you sure you want to delete the selected item(s) from download list and from hard drive? Sei sicuro di voler rimuovere gli elementi selezionati dalla lista dei download e dal disco? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? Sei sicuro di voler rimuovere gli oggetti selezionati dalla lista dei download completati e dal disco? @@ -2322,50 +2322,50 @@ Sei sicuro di voler uscire da qBittorrent? Fallito seed per l'url: %1, messaggio: %2 - + Alt+3 shortcut to switch to third tab Alt+3 - + Ctrl+F shortcut to switch to search tab Ctrl+F - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 qBittorrent è in ascolto sulla porta: TCP/%1 - + UPnP support [OFF] Supporto UPnP [OFF] - + NAT-PMP support [ON] Supporto NAT-PMP [ON] - + NAT-PMP support [OFF] Supporto NAT-PMP [OFF] - + DHT support [ON], port: UDP/%1 Supporto DHT [ON], porta: UDP/%1 - + Local Peer Discovery [ON] Supporto scoperta peer locali [ON] - + Local Peer Discovery support [OFF] Supporto scoperta peer locali [OFF] @@ -2375,48 +2375,48 @@ Sei sicuro di voler uscire da qBittorrent? '%1' è stato rimosso perché il suo rapporto di condivisione ha raggiunto il massimo stabilito. - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) - - + + DL: %1 KiB/s DL: %1 KiB/s - - + + UP: %1 KiB/s UP: %1 KiB/s - - + + Ratio: %1 Rapporto: %1 - - + + DHT: %1 nodes DHT: %1 nodi - - + + No direct connections. This may indicate network configuration problems. Nessuna connessione diretta. Questo potrebbe indicare problemi di configurazione della rete. - + Uploads Upload - + Options were saved successfully. Le opzioni sono state salvate. @@ -3093,12 +3093,12 @@ p, li { white-space: pre-wrap; } Motore di ricerca - + Empty search pattern Campo di ricerca vuoto - + Please type a search pattern first Per favore inserire prima un campo di ricerca @@ -3111,13 +3111,13 @@ p, li { white-space: pre-wrap; } Selezionare almeno un motore di ricerca. - - + + Results Risultati - + Searching... Ricerca in corso... @@ -3160,58 +3160,58 @@ Changelog: Il plugin di ricerca è già aggiornato. - + Cut Taglia - + Copy Copia - + Paste Incolla - + Clear field Azzera campo - + Clear completion history Azzera cronologia completamento - + Search Engine Motore di Ricerca - - + + Search has finished La ricerca è terminata - + An error occured during search... Si è verificato un errore durante la ricerca... - + Search aborted Ricerca annullata - + Search returned no results La ricerca non ha prodotto risultati - + Results i.e: Search results Risultati @@ -3225,8 +3225,8 @@ Changelog: Impossibile aggiornare il plugin all'url: %1, motivo: %2. - - + + Unknown Sconosciuto @@ -3388,6 +3388,11 @@ Changelog: Download in sequential order (slower but good for previewing) Scarica nell'ordine giusto (più lento ma migliore per le anteprime) + + + Skip file checking and start seeding immediately + + File name Nome del file @@ -3405,17 +3410,17 @@ Changelog: Scarica nell'ordine giusto (più lento ma migliore per le anteprime) - + Add to download list in paused state Aggiungi fra i download mettendolo in pausa - + Add Aggiungi - + Cancel Cancella @@ -3428,22 +3433,22 @@ Changelog: Seleziona - + Ignored Ignora - + Normal Normale - + High Alta - + Maximum Massima @@ -3517,18 +3522,18 @@ Changelog: bittorrent - + %1 reached the maximum ratio you set. %1 ha raggiunto il rapporto massimo impostato. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. '%1' è stato cancellato permanentemente. - + '%1' was removed. 'xxx.avi' was removed. '%1' è stato rimosso. @@ -3544,96 +3549,96 @@ Changelog: '%1' ripreso. - + '%1' is not a valid magnet URI. '%1' non è un URI magnetico valido. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. '%1' è già nella lista dei download. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) '%1' ripreso. (recupero veloce) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. '%1' è stato aggiunto alla lista dei download. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' Impossibile decifrare il file torrent: '%1' - + This file is either corrupted or this isn't a torrent. Questo file è corrotto o non è un torrent. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked <font color='red'>%1</font> <i>è stato bloccato a causa dei tuoi filtri IP</i> - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned <font color='red'>%1</font> <i>è stato bannato a causa di parti corrotte</i> - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 Download ricorsivo del file %1 incluso nel torrent %2 - + Unable to decode %1 torrent file. Impossibile decifrare il file torrent %1. - + Couldn't listen on any of the given ports. Impossibile mettersi in ascolto sulle porte scelte. - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: mappatura porte fallita, messaggio: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: mappatura porte riuscita, messaggio: %1 - + Fast resume data was rejected for torrent %1, checking again... Il recupero veloce del torrent %1 è stato rifiutato, altro tentativo in corso... - + Url seed lookup failed for url: %1, message: %2 Fallito seed web per l'indirizzo: %1, messaggio: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Download di '%1' in corso... @@ -3954,6 +3959,125 @@ Changelog: Per favore inserire almeno un indirizzo web. + + downloadThread + + + + I/O Error + Errore I/O + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + Errore sconosciuto + + downloading @@ -4179,12 +4303,12 @@ Changelog: Falso - + Uninstall warning Avviso di disinstallazione - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. @@ -4193,7 +4317,7 @@ However, those plugins were disabled. Comunque, quei plugin sono stati disabilitati. - + Uninstall success Disinstallazione riuscita @@ -4202,62 +4326,62 @@ Comunque, quei plugin sono stati disabilitati. Tutti i plugin selezionati sono stati disinstallati con successo - + Select search plugins Seleziona plugin di ricerca - - + + qBittorrent search plugins Plugin di ricerca di qBittorrent - - - - - - - - + + + + + + + + Search plugin install Installare plugin di ricerca - - - + + + Yes - - - - + + + + No No - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine Una versione più recente del plugin di ricerca %1 è già installata. @@ -4273,17 +4397,17 @@ Comunque, quei plugin sono stati disabilitati. Il plugin di ricerca %1 è stato installato con successo. - - - - - + + + + + Search plugin update Aggiornato il plugin di ricerca - - + + Sorry, update server is temporarily unavailable. Spiacente, il server è momentaneamente non disponibile. @@ -4298,37 +4422,37 @@ Comunque, quei plugin sono stati disabilitati. Spiacente, l'aggiornamento del plugin di ricerca %1 è fallito. - + All your plugins are already up to date. Tutti i plugin sono già aggiornati. - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine Non è stato possibile aggiornare %1, mantengo la versione attuale. - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine Non è stato possibile installare il plugin di ricerca %1. - + All selected plugins were uninstalled successfully Tutti i plugin selezionati sono stati disinstallati con successo - + %1 search engine plugin was successfully updated. %1 is the name of the search engine Il plugin di ricerca %1 è stato aggiornato con successo. - + %1 search engine plugin was successfully installed. %1 is the name of the search engine Il plugin di ricerca %1 è stato installato con successo. @@ -4339,24 +4463,24 @@ Comunque, quei plugin sono stati disabilitati. Il plugin di ricerca %1 è stato aggiornato con successo. - + Search engine plugin archive could not be read. Non è stato possibile leggere l'archivio dei plugin dei motori di ricerca. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine Spiacente, l'installazione del plugin di ricerca %1 è fallita. - + New search engine plugin URL Indirizzo del nuovo plugin di ricerca - + URL: Indirizzo web: @@ -5226,29 +5350,24 @@ Comunque, quei plugin sono stati disabilitati. subDownloadThread - Host is unreachable - Host non raggiungibile + Host non raggiungibile - File was not found (404) - File non trovato (404) + File non trovato (404) - Connection was denied - Connessione negata + Connessione negata - Url is invalid - Indirizzo non valido + Indirizzo non valido - I/O Error - Errore I/O + Errore I/O Connection forbidden (403) @@ -5263,29 +5382,24 @@ Comunque, quei plugin sono stati disabilitati. Il contenuto è stato spostato (301) - Connection failure - Connessione fallita + Connessione fallita - Connection was timed out - Connessione scaduta + Connessione scaduta - Incorrect network interface - Interfaccia di rete non corretta + Interfaccia di rete non corretta - Unknown error - Errore sconosciuto + Errore sconosciuto - Could not resolve proxy - Impossibile risolvere proxy + Impossibile risolvere proxy @@ -5351,12 +5465,12 @@ Comunque, quei plugin sono stati disabilitati. Impossibile creare la directory di salvataggio - + Invalid file selection Selezione file non valida - + You must select at least one file in the torrent Devi selezionare almeno un file nel torrent diff --git a/src/lang/qbittorrent_ja.qm b/src/lang/qbittorrent_ja.qm index d56863be9c5dd5f94d1cda45b5ca5588a256490a..57a44d7047b9cbeb5b2609794c0cacfc767a4671 100644 GIT binary patch delta 1757 zcmXAqX;2hb6opUsbWhVg^dM+J2{LMA0JRWNf-4j;DBxBqFfb7m1pxuUg+*ir0Z}w) z#D`17B}R=Hmn;;RxW=fcF{q_+iLtE2T@#IE)F^7mwcf9STdu2J=GFZGFsTNxpN4q&C}5e*Ip8!5Hz{&P$J*moF+ZvHp|5xRWXRE>bhbBV zb_%DXkogJz{hA?fmVq3Jv+yfU=LOD+5s<%V1Jd1~mQDkvdNYSG$SvwdB|VG4h=q@U z+#{@22op{+Ssa)23leHp0gjunWt9LO8(>@g66iDziA&pocMo&=PUcM5#OaKNy`c^W z8N+G&ozwXe_SdCUeJyJe`*vx^!GPmH=4<@*B~>$M5!w!ux_Nim8_`l$EsVa{1L&I1 z>0in@@s+UslOiDen$SF|6XkH>wB>U;YlXdTV@cj>;mn0dpijMUF}ngVMG2Rp4pDTA zaDRIoP#h?__ICoFt)gdu9VjdnBSL(EDG$VmmR>ZriW1R2lM?uJ;0~`?7{Cf;|?@!JF&&7SwW*Y58_RtXSkriQ>G>788<87F9Z!eJb zlns-Dyk|!mR(O05#FmM;4T zo|AU<*+!%7EFIFQO3ff0o9724S*4b&AA$JAoQ`#@Ne&Y>vWK#Df-OK!U^Kt}M>xah za?brwP7jWvJ!qF_?xXan^W<48cK{wIRtg)!fqA=>nzL(w8No`OfvV1&rmPCT52#tn=9LeC5*Mbs zc=da%G$vDz^M@)27tpAD?8?noO?3Kza?8FC5Ed$L8d?GKH!fW}F9)W*V972Kf`e^v z@fTLIRu})kC#rGPDIg(|v*2^ia;NH@{glSINe!%-LG^?&Kh1KbSnuVH2daiZ5x1744o$dB~L^2g{gruol v-?-A;K9L#wSVeOh8?_?b&7783G&3hJH7zc4c6w@BW6jjy-i>!wyfFL^R~rZn delta 2565 zcmaKtdr(tn8pfY2U8;qxRK*LpD&eM}fdq(zL~|iP3E}E( z(W)O%yRL4%P|;d#mr+Mut5y-Wu6D-`b+@hE-D-E#uI^Y?J8Qk{%Y0ME+G+pD{4(bx z&-=d5^M2>t+97_iTUE;gd69nfIWTXK4}k^5GW~|N;iE`(Q5#S&590AtK(v!H`5Y8i29@8~&}$GK zf8TI3Dl+>ks4^x3`R{Qqy~_W*MT)O96* z=}qPnQo>UrS^)n6O#8B#?)74N%PpXC2J00j30drcFxOOooVE_YXGN~H7I>x`xt;$5 zhRsFZj8>p=5%ShN0-ih08MT-*Cx+8^0R`RdKvE`WZYgKI9|ia8X!3B@C5|87iequT zKzS4Xy@$F>S%G`UUj!VL?4}s)4;JS1j|N6AXCmz2*f{KNk+p9!50+IdkrE z)`ts+hGdc5tAq<5zYILTS?I550<_bFPo}*O*t>-5yRrfAelci5JrH(Y42vrOszfm@ zDGFG!OiVj77MR~URxGenff0Jns3T%koRN$(h+Zv4;+V|YoGvz*(g6J_ab@>fif^j; z`nRWnUwqA(d{;b@5ezK+8|zo3hL-m#7P(0O*+|8rYli@9EsIemL@w`BtPed5EK@2v z2RA08MX{xbRO)ZBN@arRKFYQz4M~Lul=;&VfTC1o!MrbN_hOW;x&az$vC=QmaEsR~ z8+XvoEeTYvH0}kK&tZ3z+LD!1=V1qw&AOjT@r zj&kqwT|nJd<@*}yTcc2(u89Hi_A1X$PSVjijNN2sACk5tPy?gm2pR5gwdX`{R<|Ar!R{~J|vgN0mqL)98Vn^yFY zWd_9h=cqQX+62^ga{6wo_9|A>F*2+EaDr44KHNWQO;pYNEy)@v^p#hOu zv{^~JICEd)^cHj0?+h4sl)4C+6)@>vTPf;00qG|{1#E2r=@-aWHV}{~h%81*6P7TG z6dkfu3Ny|EsvD)qugIc`gRDa`_&pyyK_fRcLlQec{(V7|aubwuFNCff5R z4eJVwO{`W2bo`0J>*MsqakeC=LnfpE4dv>{ivI%HG3xlXr8MC&b|=tKT-K?c*&7ZF zIjhe9XFD)ASY2q-(8KVqx@h&s^Z;1NX}rT(k;myVa<-JJJ=ZCIQ?|OgbssRPTkV@t z3n;DXhDS7cgN}LB(ZgR=-%|Di@@7usN>1NK_Kw;xw)vtaEa@tp)J>YWKC;6cqRIPA zMe96Xv*`C<05kV#${r4NZUUK=;+1|5NR?Tm4oDac{kSzXk& zYk-~CM2V)G?51XJNQ?GN-ZwzYo7z7YmXqPMy4nP>v5)z*hS7PKgXZT@G%tp6rnPd` zoCqqYpc1*4S+6!%P_vOi(?h)jx)He)^e<28#w?`CtXG&PC|W3D9YN9aQgpV?F@QnT z`PyByWLtI3>YenO(d*hW$h?NX=-v);1I_{6>9bSlo#oeEimnIJXX^eMN@vJ+jI(Kz z?%s+E|OS*i&%}=!C29gj0=o6amu-h#q zZmYwtFEv?h9;Zd3%ONgL@hc9m-R3Zvv&)?plUY#E0Uh(A2t;jx+Zc86Qj#LlI7$j z@jp{2O#VzhOddGaXBQ9szH6C17JVke;d1M(F1^Q2nUs{9ifuoNiya-8=>LiQ#%Ad% zN~({@OXc(ODXQ}y`M$g#dKztjGPqA;?xOF9sdE0~n$OL&mpGhG+7Z3o;`Tb66?&`P zZE=>GN`6%P`&D79ipS^uL=T}b!U-Eybqsd%gId8xr)_XNtG&u(vp%^xPbA!Pd+h_o F{{a$2`B4A> diff --git a/src/lang/qbittorrent_ja.ts b/src/lang/qbittorrent_ja.ts index c49dd9623..bc41e29de 100644 --- a/src/lang/qbittorrent_ja.ts +++ b/src/lang/qbittorrent_ja.ts @@ -1542,7 +1542,7 @@ Copyright © 2006 by Christophe Dumez<br> GUI - + Open Torrent Files Torrent ファイルを開く @@ -1551,25 +1551,25 @@ Copyright © 2006 by Christophe Dumez<br> このファイルは壊れているかこれは torrent ではないかのどちらかです。 - - - - - + + + + + &Yes はい(&Y) - - - - - + + + + + &No いいえ(&N) - + Are you sure you want to delete the selected item(s) in download list? ダウンロードの一覧にある選択されたアイテムを削除してもよろしいですか? @@ -1582,15 +1582,15 @@ Copyright © 2006 by Christophe Dumez<br> ダウンロードしています.... - + Torrent Files Torrent ファイル - - - - + + + + Are you sure? -- qBittorrent よろしいですか? -- qBittorrent @@ -1617,7 +1617,7 @@ Please close the other one first. まず他の 1 つを閉じてください。 - + Download finished ダウンロードが完了しました @@ -1626,15 +1626,15 @@ Please close the other one first. ダウンロードの一覧およびハード ドライブにある選択されたアイテムを削除してもよろしいですか? - - + + qBittorrent %1 e.g: qBittorrent v0.x qBittorrent %1 - - + + Connection status: 接続状態: @@ -1687,21 +1687,21 @@ Please close the other one first. qBittorrent %1 が開始されました。 - - + + qBittorrent qBittorrent - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s DL 速度: %1 KiB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s UP 速度: %1 KiB/s @@ -1717,7 +1717,7 @@ Please close the other one first. 失速しました - + Are you sure you want to quit? 終了してもよろしいですか? @@ -1775,14 +1775,14 @@ Please close the other one first. '%1' が再開されました。 - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. %1 はダウンロードが完了しました。 - + I/O Error i.e: Input/Output Error I/O エラー @@ -1793,12 +1793,12 @@ Please close the other one first. %1 の読み込みまたは書き込みを試行にエラーが発生しました。ディスクはおそらくいっぱいです、ダウンロードは一時停止されました - + Connection Status: 接続状態: - + Online オンライン @@ -1817,18 +1817,18 @@ Please close the other one first. '%1' をダウンロードしています、お待ちください... - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. エラーが発生しました (ディスクいっぱい?)、'%1' が停止されました。 - + Search 検索 - + RSS RSS @@ -1850,8 +1850,8 @@ Please close the other one first. DHT サポート [オン]、ポート: %1 - - + + DHT support [OFF] DHT サポート [オフ] @@ -1860,12 +1860,12 @@ Please close the other one first. UPnP サポート [オン]、ポート: %1 - + UPnP support [OFF] UPnP サポート [オフ] - + PeX support [ON] PeX サポート [オン] @@ -1874,20 +1874,20 @@ Please close the other one first. PeX サポート [オフ] - + The download list is not empty. Are you sure you want to quit qBittorrent? ダウンロードの一覧は空ではありません。 qBittorrent を終了してもよろしいですか? - - + + Downloads ダウンロード - + Finished 完了しました @@ -1896,12 +1896,12 @@ qBittorrent を終了してもよろしいですか? 完了済みの一覧およびハード ドライブにある選択されたアイテムを削除してもよろしいですか? - + Are you sure you want to delete the selected item(s) in finished list? ダウンロードの一覧にある選択されたアイテムを削除してもよろしいですか? - + UPnP support [ON] UPnP サポート [オン] @@ -1910,17 +1910,17 @@ qBittorrent を終了してもよろしいですか? ご用心ください、許可なしの著作権のある材料の共有は法律に違反しています。 - + Encryption support [ON] 暗号化サポート [オン] - + Encryption support [FORCED] 暗号化サポート [強制済み] - + Encryption support [OFF] 暗号化サポート [オフ] @@ -1934,13 +1934,13 @@ qBittorrent を終了してもよろしいですか? - + Alt+1 shortcut to switch to first tab Alt+1 - + Alt+2 shortcut to switch to second tab Alt+2 @@ -1951,18 +1951,18 @@ qBittorrent を終了してもよろしいですか? Alt+3、Ctrl+F - + Alt+4 shortcut to switch to fourth tab Alt+4 - + Url download error Url のダウンロード エラー - + Couldn't download file at url: %1, reason: %2. 次の url にあるファイルをダウンロードできませんでした: %1、理由: %2。 @@ -1971,12 +1971,12 @@ qBittorrent を終了してもよろしいですか? 高速再開データは torrent %1 を拒絶しました、再びチェックしています... - + Are you sure you want to delete the selected item(s) from download list and from hard drive? ダウンロードの一覧とハード ドライブから選択されたアイテムを削除してもよろしいですか? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? 完了済みの一覧とハード ドライブから選択されたアイテムを削除してもよろしいですか? @@ -1990,13 +1990,13 @@ qBittorrent を終了してもよろしいですか? 次の url の url シードの参照に失敗しました: %1、メッセージ: %2 - + Alt+3 shortcut to switch to third tab Alt+3 - + Ctrl+F shortcut to switch to search tab Ctrl+F @@ -2007,73 +2007,73 @@ qBittorrent を終了してもよろしいですか? '%1' はその率が設定した最大値を達成したので削除されました。 - + NAT-PMP support [ON] NAT-PMP サポート [オン] - + NAT-PMP support [OFF] NAT-PMP サポート [オフ] - + DHT support [ON], port: UDP/%1 - + Local Peer Discovery [ON] ローカル ピア ディスカバリ [オン] - + Local Peer Discovery support [OFF] ローカル ピア ディスカバリ [オフ] - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version qBittorrent %1 (DL: %2KiB/s、UP: %3KiB/s) - - + + DL: %1 KiB/s - - + + UP: %1 KiB/s - - + + Ratio: %1 - - + + DHT: %1 nodes - - + + No direct connections. This may indicate network configuration problems. - + Uploads - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -2081,13 +2081,13 @@ qBittorrent を終了してもよろしいですか? - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 - + Options were saved successfully. オプションの保存に成功しました。 @@ -2720,12 +2720,12 @@ p, li { white-space: pre-wrap; } 検索エンジン - + Empty search pattern 検索パターンを空にする - + Please type a search pattern first まず検索パターンを入力してください @@ -2738,13 +2738,13 @@ p, li { white-space: pre-wrap; } 少なくとも 1 つの検索エンジンを選択する必要があります。 - - + + Results 結果 - + Searching... 検索しています... @@ -2787,58 +2787,58 @@ Changelog: お使いの検索プラグインはすでに最新です。 - + Cut - + Copy - + Paste - + Clear field - + Clear completion history - + Search Engine 検索エンジン - - + + Search has finished 検索は完了しました - + An error occured during search... 検索中にエラーが発生しました... - + Search aborted 検索が中止されました - + Search returned no results 検索結果がありません - + Results i.e: Search results 結果 @@ -2852,8 +2852,8 @@ Changelog: 次の url にある検索プラグインの更新をダウンロードできませんでした: %1、理由: %2。 - - + + Unknown 不明 @@ -3007,6 +3007,11 @@ Changelog: Download in sequential order (slower but good for previewing) + + + Skip file checking and start seeding immediately + + File name ファイル名 @@ -3024,17 +3029,17 @@ Changelog: 正しい順にダウンロードする (より遅いがプレビューにはふさわしい) - + Add to download list in paused state 一時停止済み状態でダウンロードの一覧に追加する - + Add 追加 - + Cancel キャンセル @@ -3047,22 +3052,22 @@ Changelog: 選択 - + Ignored 無視済み - + Normal 通常 - + High - + Maximum 最大 @@ -3132,18 +3137,18 @@ Changelog: bittorrent - + %1 reached the maximum ratio you set. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. '%1' は永久に削除されました。 - + '%1' was removed. 'xxx.avi' was removed. '%1' は削除されました。 @@ -3159,96 +3164,96 @@ Changelog: '%1' が再開されました。 - + '%1' is not a valid magnet URI. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. '%1' はすでにダウンロードの一覧にあります。 - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) '%1' が再開されました。 (高速再開) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. '%1' がダウンロードの一覧に追加されました。 - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' Torrent ファイルをデコードすることができません: '%1' - + This file is either corrupted or this isn't a torrent. このファイルは壊れているかこれは torrent ではないかのどちらかです。 - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 - + Unable to decode %1 torrent file. - + Couldn't listen on any of the given ports. 所定のポートで記入できませんでした。 - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + Fast resume data was rejected for torrent %1, checking again... 高速再開データは torrent %1 を拒絶しました、再びチェックしています... - + Url seed lookup failed for url: %1, message: %2 次の url の url シードの参照に失敗しました: %1、メッセージ: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... '%1' をダウンロードしています、お待ちください... @@ -3585,6 +3590,125 @@ Changelog: 少なくとも 1 つの URL を入力してください。 + + downloadThread + + + + I/O Error + I/O エラー + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + 不明なエラーです + + downloading @@ -3810,12 +3934,12 @@ Changelog: False - + Uninstall warning アンインストールの警告 - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. @@ -3824,7 +3948,7 @@ However, those plugins were disabled. しかし、それらのプラグインは無効になります。 - + Uninstall success アンインストール成功 @@ -3833,47 +3957,47 @@ However, those plugins were disabled. すべての選択されたプラグインのアンインストールに成功しました - + Select search plugins 検索プラグインの選択 - - + + qBittorrent search plugins qBittorrent 検索プラグイン - - - - - - - - + + + + + + + + Search plugin install 検索プラグインのインストール - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine %1 検索エンジン プラグインのより最近のバージョンはすでにインストールされています。 @@ -3889,17 +4013,17 @@ However, those plugins were disabled. %1 検索エンジン プラグインのインストールに成功しました。 - - - - - + + + + + Search plugin update 検索プラグインの更新 - - + + Sorry, update server is temporarily unavailable. すみません、更新サーバーが一時的に利用不可です。 @@ -3914,75 +4038,75 @@ However, those plugins were disabled. すみません、%1 検索プラグインの更新に失敗しました。 - + All your plugins are already up to date. すべてのお使いのプラグインはすでに最新です。 - + All selected plugins were uninstalled successfully すべての選択されたプラグインのアンインストールに成功しました - - - + + + Yes - - - - + + + + No - + Search engine plugin archive could not be read. 検索エンジン プラグイン アーカイブは読み込めませんでした。 - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine %1 検索エンジン プラグインはインストールできませんでした。 - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine %1 検索エンジン プラグインは更新できませんでした、古いバージョンを維持します。 - + %1 search engine plugin was successfully updated. %1 is the name of the search engine %1 検索エンジン プラグインの更新に成功しました。 - + %1 search engine plugin was successfully installed. %1 is the name of the search engine %1 検索エンジン プラグインのインストールに成功しました。 - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine すみません、%1 検索エンジン プラグインのインストールに失敗しました。 - + New search engine plugin URL 新しい検索エンジン プラグインの URL - + URL: URL: @@ -4708,29 +4832,24 @@ However, those plugins were disabled. subDownloadThread - Host is unreachable - ホストは達成できません + ホストは達成できません - File was not found (404) - ファイルは見つかりませんでした (404) + ファイルは見つかりませんでした (404) - Connection was denied - 接続は拒否されました + 接続は拒否されました - Url is invalid - Url は不正です + Url は不正です - I/O Error - I/O エラー + I/O エラー Connection forbidden (403) @@ -4745,29 +4864,24 @@ However, those plugins were disabled. 内容は移動しました (301) - Connection failure - 接続失敗 + 接続失敗 - Connection was timed out - 接続はタイムアウトしました + 接続はタイムアウトしました - Incorrect network interface - 不正確なネットワーク インターフェイスです + 不正確なネットワーク インターフェイスです - Unknown error - 不明なエラーです + 不明なエラーです - Could not resolve proxy - プロキシを解決できませんでした + プロキシを解決できませんでした @@ -4833,12 +4947,12 @@ However, those plugins were disabled. 保存パスを作成できませんでした - + Invalid file selection 不正なファイル選択 - + You must select at least one file in the torrent Torrent では少なくとも 1 つのファイルを選択する必要があります diff --git a/src/lang/qbittorrent_ko.qm b/src/lang/qbittorrent_ko.qm index 79e9ac36e05ba5414170f5b661cb31077e54a505..ae6fd95c757a301f03a9177e64fe6764cf5f57c8 100644 GIT binary patch delta 1926 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 업로딩 속도: - + Open Torrent Files 토런트 파일 열기 - + Torrent Files 토런트 파일 @@ -1744,20 +1744,20 @@ list? 파일을 지우고 싶으세요? - - - - - + + + + + &Yes &예 - - - - - + + + + + &No &아니요 @@ -1812,7 +1812,7 @@ download list? 다시 시작됨. - + Finished 완료 @@ -1852,7 +1852,7 @@ download list? 다운로드 목록에 있는 모든 파일을 지우고 싶으세요? - + Are you sure you want to delete the selected item(s) in download list? 다운로딩 목록에서 선택하신 모든 아이템을 삭제하시겠습니까? @@ -1865,16 +1865,16 @@ download list? 개발자: 크리스토프 두메스 :: Copyright (c) 2006 - - + + qBittorrent 큐비토런트 - - - - + + + + Are you sure? -- qBittorrent 재확인해주십시요? -- 큐비토런트 @@ -2133,7 +2133,7 @@ Please close the other one first. 정말로 지금 선택하신 파일들을 다운로드 목록과 하드 드라이브에서 삭제하시겠습니까? - + Download finished 다운로드 완료 @@ -2147,15 +2147,15 @@ Please close the other one first. 검색 엔진 - - + + qBittorrent %1 e.g: qBittorrent v0.x 큐비토런트 %1 - - + + Connection status: 연결 상태: @@ -2218,15 +2218,15 @@ Please close the other one first. 큐비토런트 %1가 시작되었습니다. - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s 다운로딩 속도: %1 KiB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s 업로딩 속도: %1 KiB/s @@ -2247,7 +2247,7 @@ Please close the other one first. 대기중 - + Are you sure you want to quit? 정말로 종료하시겠습니까? @@ -2310,14 +2310,14 @@ Please close the other one first. '%1' 가 다운로드를 다시 시작되었습니다. - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. %1가 다운로드를 완료하였습니다. - + I/O Error i.e: Input/Output Error I/O 에러 @@ -2333,12 +2333,12 @@ Please close the other one first. 오류 발생 (디스크가 꽉찼습니까?), '%1'가 정지 되었습니다. - + Connection Status: 연결 상태: - + Online 온라인 @@ -2374,23 +2374,23 @@ Please close the other one first. '%1'을 다운 중입니다, 잠시 기다려 주세요... - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. 오류 발생 (디스크가 꽉찼습니까?), '%1'가 정지 되었습니다. - + Search 검색 - + RSS - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -2408,13 +2408,13 @@ Please close the other one first. DHT 지원 [사용함], 포트: %1 - - + + DHT support [OFF] DHT 지원 [사용안함] - + PeX support [ON] Pes 지원 [사용함] @@ -2423,25 +2423,25 @@ Please close the other one first. Pes 지원 [사용안함] - + The download list is not empty. Are you sure you want to quit qBittorrent? 다운로드 리스트가 파일이 있습니다. 큐비토런트를 종료하시겠습니까? - - + + Downloads 다운로드 - + Are you sure you want to delete the selected item(s) in finished list? 현재 완료목록에서 선택된 파일을 지우시겠습니까? - + UPnP support [ON] UPnp 지원 [사용함] @@ -2450,17 +2450,17 @@ Are you sure you want to quit qBittorrent? 허락없이 저작권이 있는 자료를 공유하는 것은 법에 저촉됩니다. - + Encryption support [ON] 암호화(Encryption) 지원 [사용함] - + Encryption support [FORCED] 암호화(Encryption) 지원 [강압적으로 사용] - + Encryption support [OFF] 암호화(Encryption) 지원 [사용안함] @@ -2474,30 +2474,30 @@ Are you sure you want to quit qBittorrent? 비율 - + Alt+1 shortcut to switch to first tab - + Alt+2 shortcut to switch to second tab - + Alt+4 shortcut to switch to fourth tab - + Url download error Url 다운로드 오류 - + Couldn't download file at url: %1, reason: %2. 다음 주소(Url)에서 파일을 다운로드할수 없습니다: %1, 이유:%2. @@ -2506,12 +2506,12 @@ Are you sure you want to quit qBittorrent? 토렌트 %1는 빨리 이어받기가 사용될수 없습니다, 확인중입니다... - + Are you sure you want to delete the selected item(s) from download list and from hard drive? 다운로드 목록에서 선택된 파일을 하드 드라이버에서도 지우시겠습니까? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? 완료 목록에서 선택된 파일을 하드 드라이버에서도 지우시겠습니까? @@ -2525,50 +2525,50 @@ Are you sure you want to quit qBittorrent? 다음 Url 완전체(Url seed)의 검색이 실패하였습니다: %1, 관련내용: %2 - + Alt+3 shortcut to switch to third tab - + Ctrl+F shortcut to switch to search tab - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 큐비토런트는 다음 포트을 사용하고 있습니다: TCP/%1 - + UPnP support [OFF] UPnP 지원 [사용안함] - + NAT-PMP support [ON] NAT-PMP 지원 [사용함] - + NAT-PMP support [OFF] NAT-PMP 지원 [사용안함] - + DHT support [ON], port: UDP/%1 DHT 지원 [사용함], 포트:'UDP/%1 - + Local Peer Discovery [ON] Local Peer Discovery (로컬 네트웍크내 공유자 찾기) [사용함] - + Local Peer Discovery support [OFF] Local Peer Discovery (로컬 네트웍크내 공유자 찾기) [사용안함] @@ -2578,48 +2578,48 @@ Are you sure you want to quit qBittorrent? 사용자께거 지정하신 할당율에 도달하였기에 '%1'는(은) 목록에서 삭제되었습니다. - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version 큐비토런트 버젼: %1 (DL: %2KiB/s, UP: %3KiB/s) - - + + DL: %1 KiB/s 다운로딩 속도: %1 KiB/s - - + + UP: %1 KiB/s 업로딩 속도: %1 KiB/s - - + + Ratio: %1 비율: %1 - - + + DHT: %1 nodes DHT: %1 노드(nodes) - - + + No direct connections. This may indicate network configuration problems. 직접적으로 연결된 네트워크를 찾지 못했습니다. 네트워크 설정에 의해 발생된 오류일 가능성이 있습니다. - + Uploads 업로드 - + Options were saved successfully. 설정이 성공적으로 저장되었습니다. @@ -3343,12 +3343,12 @@ p, li { white-space: pre-wrap; } 검색 엔진 - + Empty search pattern 검색 양식 지우기 - + Please type a search pattern first 검색 양식을 작성해주십시오 @@ -3361,13 +3361,13 @@ p, li { white-space: pre-wrap; } 적어도 하나 이상의 검색 엔진을 선택해야 합니다. - - + + Results 결과 - + Searching... 검색중... @@ -3410,58 +3410,58 @@ Changelog: 님은 현재 최신 검색 엔진 플로그인을 사용중입니다. - + Cut 잘라내기 - + Copy 복사하기 - + Paste 붙이기 - + Clear field 내용 지우기 - + Clear completion history 완료 내역 지우기 - + Search Engine 검색 엔진 - - + + Search has finished 검색 완료 - + An error occured during search... 검색 중 오류 발생... - + Search aborted 검색이 중단됨 - + Search returned no results 검색 결과가 없음 - + Results i.e: Search results 결과 @@ -3475,8 +3475,8 @@ Changelog: 다음 url에서 검색 플러그인 (Plugin)을 다운로드 할수 없습니다: %1, 이유: %2. - - + + Unknown 알려지지 않음 @@ -3654,6 +3654,11 @@ Changelog: Download in sequential order (slower but good for previewing) 순차적으로 다운받기(느리지만 미리보기에 좋음) + + + Skip file checking and start seeding immediately + + File name 파일 이름 @@ -3671,17 +3676,17 @@ Changelog: 순차적으로 다운받기(느리지만 미리보기에 편합니다) - + Add to download list in paused state 정지 상태로 다운로드 목록에 추가하기 - + Add 추가 - + Cancel 취소 @@ -3698,22 +3703,22 @@ Changelog: 선택 - + Ignored 무시 - + Normal 보통 - + High 높음 - + Maximum 최고 @@ -3783,18 +3788,18 @@ Changelog: bittorrent - + %1 reached the maximum ratio you set. '%1' 는 설정된 최대 공유 비율에 도달했습니다. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. '%1' 는 영구삭제 되었습니다. - + '%1' was removed. 'xxx.avi' was removed. '%1' 가 삭제되었습니다. @@ -3810,96 +3815,96 @@ Changelog: '%1' 가 다운로드를 다시 시작되었습니다. - + '%1' is not a valid magnet URI. '%1'는 유효한 마그넷 URI (magnet URI)가 아닙니다. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. '%1'는/은 이미 다운로드 목록에 포함되어 있습니다. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) '%1'가 다시 시작되었습니다. (빠른 재개) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. '%1'가 다운로드 목록에 추가되었습니다. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' 다음 파일은 해독 할수가 없습니다: '%1' - + This file is either corrupted or this isn't a torrent. 이 파일은 오류가 있거나 토런트 파일이 아닙니다. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked <font color='red'>%1</font> <i>은/는 IP 필터에 의해 접속이 금지되었습니다</i> - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned <font color='red'>%1</font> <i>은/는 유효하지 않은 파일 공유에 의해 접속이 금지되었습니다</i> - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 토렌트 %2 에는 회귀적 다운로드 파일 %1이 포함되어 있습니다 - + Unable to decode %1 torrent file. %1 토렌트를 해독할수 없습니다. - + Couldn't listen on any of the given ports. 설정하신 포트에 연결할수 없습니다. - + UPnP/NAT-PMP: Port mapping failure, message: %1 UPnP/NAT-PMP: Port mapping 실패, 메세지: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 UPnP/NAT-PMP: Port mapping 성공, 메세지: %1 - + Fast resume data was rejected for torrent %1, checking again... 토렌트 %1는 빨리 이어받기가 사용될수 없습니다, 확인중입니다... - + Url seed lookup failed for url: %1, message: %2 다음 Url 완전체(Url seed)의 검색이 실패하였습니다: %1, 관련내용: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... '%1'을 다운 중입니다, 잠시 기다려 주세요... @@ -4232,6 +4237,125 @@ Changelog: 적어도 하나의 주소(URL)를 적어주십시오. + + downloadThread + + + + I/O Error + I/O 에러 + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + 알수 없는 오류 + + downloading @@ -4453,12 +4577,12 @@ Changelog: 아님 - + Uninstall warning 언인스톨 경고 - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. @@ -4468,83 +4592,83 @@ However, those plugins were disabled. - + Uninstall success 제거 완료 - + Select search plugins 검색 플러그인을 선택하십시오 - - + + qBittorrent search plugins 큐비토런트 검색엔진 - - - - - - - - + + + + + + + + Search plugin install 검색 엔진 설치 - - - + + + Yes - - - - + + + + No 아니오 - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent 큐비토런트 - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine 최신 버젼의 %1이 이미 설치되어있습니다. - - - - - + + + + + Search plugin update 검색 엔진 플러그인 업데이트 - - + + Sorry, update server is temporarily unavailable. 죄송합니다. 현재 임시적으로 업데이트 서버가 접속이 불가능합니다. @@ -4554,37 +4678,37 @@ However, those plugins were disabled. 죄송하지만 검색엔진 %1의 업데이트가 실패하였습니다. - + All your plugins are already up to date. 모든 검색엔진이 최신버젼입니다. - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine 검색엔진 %1은 업데이트 될수 없습니다. 기존버젼을 유지하겠습니다. - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine 검색엔진 %1은/는 설치될수 없습니다. - + All selected plugins were uninstalled successfully 선택된 모든 플러그인들이 성공적으로 제거 되었습니다 - + %1 search engine plugin was successfully updated. %1 is the name of the search engine 검색엔진 %1이 성공적으로 업데이트 되었습니다. - + %1 search engine plugin was successfully installed. %1 is the name of the search engine 검색엔진 %1이 성공적으로 설치 되었습니다. @@ -4595,24 +4719,24 @@ However, those plugins were disabled. 검색엔진 %1이 성공적으로 업데이트 되었습니다. - + Search engine plugin archive could not be read. 검색엔진 플러그인이 일혀지질 않습니다. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine 죄송하지만, 검색엔진 플로그인, %1,의 설치가 실패하였습니다. - + New search engine plugin URL 새 검색엔진 플러그인 주소(URL) - + URL: @@ -5532,29 +5656,24 @@ However, those plugins were disabled. subDownloadThread - Host is unreachable - 호스트에 도달할수 없습니다 + 호스트에 도달할수 없습니다 - File was not found (404) - 파일을 찾을수 없습니다 (404) + 파일을 찾을수 없습니다 (404) - Connection was denied - 연결 시간이 부인되었습니다 + 연결 시간이 부인되었습니다 - Url is invalid - 주소(Url)가 유효하지 않습니다 + 주소(Url)가 유효하지 않습니다 - I/O Error - I/O 에러 + I/O 에러 Connection forbidden (403) @@ -5569,29 +5688,24 @@ However, those plugins were disabled. 내용이 이동되었습니다 (301) - Connection failure - 연결 실패 + 연결 실패 - Connection was timed out - 연결 시간이 초과하였습니다 + 연결 시간이 초과하였습니다 - Incorrect network interface - 네트웍크 인터페이스(network interface)가 맞지 않습니다. + 네트웍크 인터페이스(network interface)가 맞지 않습니다. - Unknown error - 알수 없는 오류 + 알수 없는 오류 - Could not resolve proxy - 프록시를 설정할수 없습니다 + 프록시를 설정할수 없습니다 @@ -5657,12 +5771,12 @@ However, those plugins were disabled. 저장 경로를 생성할수가 없습니다 - + Invalid file selection 부적당한 파일 선택 - + You must select at least one file in the torrent 토렌트에서 적어도 하나 이상의 파일을 선택해야 합니다 diff --git a/src/lang/qbittorrent_nb.qm b/src/lang/qbittorrent_nb.qm index 84be77a97210a4b32b853bf75b8fa76653e94d07..64756be44c9385dce5ab8ccb7f5f92b77e7e6221 100644 GIT binary patch delta 841 zcmXBSYe-XJ7zgnGIomm>vuVqv&dYRK;5095md;B~-JF-QpuA)Q3(-s^jEo^vqS3un zTCY+dCQ62hg=rc@Vi#KwX&2F=5-VL%L{ws6AEH;zryu9=yf6RfdEQeU%<&H9g4SyY z;F5uqbRfJA*jVO_)+crWSyzFO31IUvKx8G?hXY$*(V~~Y_GK4Rune20+v29#OTC_ zu=lh8)+1zw(L^lZdv7VA9m3zyBw*7)CM5j?{Vrv4r`7<<6iGul31WkjQZrcJa64eG zWK&)1fXtt)z1o}hH6rO@WNVc)?WSZ&o02`<(?t8z69;QxoTQuG!;}(ErWXg~eNo*s zlrM>s>6kiFAPd`JRC8@-E(7U@C9R=cpX@9h$1ZN*{&m2|OVaR3(qiEQw$b!{D3GBQ45mkX#%_99uUzf_!evi zQa=a*ZW=8yP^dY77hr3JL+Zmo=(MDHmC*S75)kheT4YN!-5;Uz;x{1el+e!-z-Sgm z8e(V)A7S23&y!Mlj&V+mXrvj^;zh&aN?@%^+}KqBL~2D#Kqb9{h`Y~D($`ZiI=G8#!f4W-qEecG${7{^9PdiNeZW9dPp&?nN{2w zrW3H`D(0KBX%9~&t=C8st@%Z6a5}MBsnyQYDT7RLdarh+tLQgfWvud9aRrdkOFVfK zGeK;8A!`aI?Yx0$CgZ$LtnhrJrpw9jCX0M(*in_n;}F2RRN9?GK+q#q)~%EDDLPa) zUx+}MAMGl8&7fVVGLSZPf@)>if!gZ*2TIEFD{A(Zlnsu?FRdo;)AGpAErElMEnf2f D!xH0G delta 840 zcmXBSdq`7J90&04z1zLlyZJ~X)fequds20dvvJ2R<J_3uGU1!RhTR7OIs~_@3?RNm z@SLU5qQ-=>hI;^8DU`b$27KN~#*GM#W352MC80(3lcwtxI?l}j2{FPAmH;91!fCZ$?EL-P(28>e;7R9bW9=_n1#7r8}1azAn4BbnpG z%xAL^ GUI - + Open Torrent Files Åpne torrentfiler @@ -1436,30 +1436,30 @@ Copyright © 2006 av Christophe Dumez<br> Ønsker du å slette alle filene in nedlastingslisten? - - - - - + + + + + &Yes &Ja - - - - - + + + + + &No &Nei - + Are you sure you want to delete the selected item(s) in download list? Ønsker du å slette valgt(e) element(er) i nedlastingslisten? - + Finished Ferdig @@ -1500,7 +1500,7 @@ Copyright © 2006 av Christophe Dumez<br> Klarte ikke å opprette mappen: - + Torrent Files Torrentfiler @@ -1545,10 +1545,10 @@ Copyright © 2006 av Christophe Dumez<br> qBittorrent - - - - + + + + Are you sure? -- qBittorrent Er du sikker? -- qBittorrent @@ -1744,7 +1744,7 @@ Vennligst avslutt denne først. Ønsker du å slette valgte element(er) i nedlastningslisten, og fra lagringsenheten? - + Download finished Nedlastingen er fullført @@ -1762,15 +1762,15 @@ Vennligst avslutt denne først. Lese/Skrive feil - - + + qBittorrent %1 e.g: qBittorrent v0.x qBittorrent %1 - - + + Connection status: Tilkoblingsstatus: @@ -1833,21 +1833,21 @@ Vennligst avslutt denne først. qBittorrent %1 er startet. - - + + qBittorrent qBittorrent - - + + DL speed: %1 KiB/s e.g: Download speed: 10 KiB/s Nedlastingshastighet: %1 KiB/s - - + + UP speed: %1 KiB/s e.g: Upload speed: 10 KiB/s Opplastingshastighet: %1 KiB/s @@ -1868,7 +1868,7 @@ Vennligst avslutt denne først. Laster ikke ned - + Are you sure you want to quit? Ønsker du å avslutte qBittorrent? @@ -1931,14 +1931,14 @@ Vennligst avslutt denne først. '%1' gjenopptatt. - - + + %1 has finished downloading. e.g: xxx.avi has finished downloading. %1 er ferdig nedlastet. - + I/O Error i.e: Input/Output Error Lese/Skrive feil @@ -1954,12 +1954,12 @@ Vennligst avslutt denne først. Det har oppstått en feil (full disk?), '%1' er pauset. - + Connection Status: Tilkoblingsstatus: - + Online Tilkoblet @@ -1995,115 +1995,115 @@ Vennligst avslutt denne først. Laster ned '%1'... - + An error occured (full disk?), '%1' paused. e.g: An error occured (full disk?), 'xxx.avi' paused. Det har oppstått en feil (full disk?), '%1' er pauset. - + Search Søk - + RSS - - + + DHT support [OFF] - + PeX support [ON] - + The download list is not empty. Are you sure you want to quit qBittorrent? - - + + Downloads - + Are you sure you want to delete the selected item(s) in finished list? - + UPnP support [ON] - + Encryption support [ON] - + Encryption support [FORCED] - + Encryption support [OFF] - + Alt+1 shortcut to switch to first tab - + Alt+2 shortcut to switch to second tab - + Alt+4 shortcut to switch to fourth tab - + Url download error - + Couldn't download file at url: %1, reason: %2. - + Are you sure you want to delete the selected item(s) from download list and from hard drive? - + Are you sure you want to delete the selected item(s) from finished list and from hard drive? - + Alt+3 shortcut to switch to third tab - + An I/O error occured for torrent %1. Reason: %2 e.g: An error occured for torrent xxx.avi. @@ -2111,90 +2111,90 @@ Are you sure you want to quit qBittorrent? - + Ctrl+F shortcut to switch to search tab - + qBittorrent is bound to port: TCP/%1 e.g: qBittorrent is bound to port: 6881 - + UPnP support [OFF] - + NAT-PMP support [ON] - + NAT-PMP support [OFF] - + DHT support [ON], port: UDP/%1 - + Local Peer Discovery [ON] - + Local Peer Discovery support [OFF] - + qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s) %1 is qBittorrent version - - + + DL: %1 KiB/s - - + + UP: %1 KiB/s - - + + Ratio: %1 - - + + DHT: %1 nodes - - + + No direct connections. This may indicate network configuration problems. - + Uploads - + Options were saved successfully. Innstillingene ble lagret. @@ -2782,12 +2782,12 @@ p, li { white-space: pre-wrap; } Søkemotor - + Empty search pattern Ingen søketekst - + Please type a search pattern first Skriv en tekst å søke etter først @@ -2800,13 +2800,13 @@ p, li { white-space: pre-wrap; } Du må velge minst en søkemotor. - - + + Results Resultater - + Searching... Søker... @@ -2848,65 +2848,65 @@ Endringer: Ditt søkeprogramtillegg er allerede oppdatert. - + Cut - + Copy - + Paste - + Clear field - + Clear completion history - + Search Engine Søkemotor - - + + Search has finished Søket er ferdig - + An error occured during search... Det oppstod en feil under søket... - + Search aborted Søket er avbrutt - + Search returned no results Søket ga ingen resultater - + Results i.e: Search results Resultater - - + + Unknown @@ -3068,6 +3068,11 @@ Endringer: Download in sequential order (slower but good for previewing) + + + Skip file checking and start seeding immediately + + File name Filnavn @@ -3085,17 +3090,17 @@ Endringer: Last ned i riktig rekkefølge (tregere, men tilpasset forhåndsvisningen) - + Add to download list in paused state Legg til i nedlastningslisten som pauset - + Add Legg til - + Cancel Avbryt @@ -3112,22 +3117,22 @@ Endringer: velg - + Ignored - + Normal - + High - + Maximum @@ -3197,18 +3202,18 @@ Endringer: bittorrent - + %1 reached the maximum ratio you set. - + '%1' was removed permanently. 'xxx.avi' was removed permanently. - + '%1' was removed. 'xxx.avi' was removed. '%1' ble fjernet. @@ -3224,96 +3229,96 @@ Endringer: '%1' gjenopptatt. - + '%1' is not a valid magnet URI. - - - + + + '%1' is already in download list. e.g: 'xxx.avi' is already in download list. '%1' finnes allerede i nedlastingslisten. - - - + + + '%1' resumed. (fast resume) '/home/y/xxx.torrent' was resumed. (fast resume) '%1' ble gjenopptatt (hurtig gjenopptaging) - - - + + + '%1' added to download list. '/home/y/xxx.torrent' was added to download list. '%1' ble lagt til i nedlastingslisten. - - + + Unable to decode torrent file: '%1' e.g: Unable to decode torrent file: '/home/y/xxx.torrent' Klarte ikke å dekode torrentfilen: '%1' - + This file is either corrupted or this isn't a torrent. Denne filen er enten ødelagt, eller det er ikke en torrent. - + <font color='red'>%1</font> <i>was blocked due to your IP filter</i> x.y.z.w was blocked - + <font color='red'>%1</font> <i>was banned due to corrupt pieces</i> x.y.z.w was banned - + Recursive download of file %1 embedded in torrent %2 Recursive download of test.torrent embedded in torrent test2 - + Unable to decode %1 torrent file. - + Couldn't listen on any of the given ports. Klarte ikke å lytte på noen av de oppgitte portene. - + UPnP/NAT-PMP: Port mapping failure, message: %1 - + UPnP/NAT-PMP: Port mapping successful, message: %1 - + Fast resume data was rejected for torrent %1, checking again... - + Url seed lookup failed for url: %1, message: %2 - + Downloading '%1', please wait... e.g: Downloading 'xxx.torrent', please wait... Laster ned '%1'... @@ -3602,6 +3607,125 @@ Endringer: Angi minst en nettadresse. + + downloadThread + + + + I/O Error + Lese/Skrive feil + + + + The remote host name was not found (invalid hostname) + + + + + The operation was canceled + + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + + The connection to the remote server timed out + + + + + SSL/TLS handshake failed + + + + + The remote server refused the connection + + + + + The connection to the proxy server was refused + + + + + The proxy server closed the connection prematurely + + + + + The proxy host name was not found + + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + + The access to the remote content was denied (401) + + + + + The operation requested on the remote content is not permitted + + + + + The remote content was not found at the server (404) + + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + + The Network Access API cannot honor the request because the protocol is not known + + + + + The requested operation is invalid for this protocol + + + + + An unknown network-related error was detected + + + + + An unknown proxy-related error was detected + + + + + An unknown error related to the remote content was detected + + + + + A breakdown in protocol was detected + + + + + Unknown error + + + downloading @@ -3819,153 +3943,153 @@ Endringer: Nei - + Uninstall warning - + Some plugins could not be uninstalled because they are included in qBittorrent. Only the ones you added yourself can be uninstalled. However, those plugins were disabled. - + Uninstall success - + Select search plugins - - + + qBittorrent search plugins - - - - - - - - + + + + + + + + Search plugin install - - - + + + Yes - - - - + + + + No - - - - - - - - - - - - - + + + + + + + + + + + + + qBittorrent qBittorrent - + A more recent version of %1 search engine plugin is already installed. %1 is the name of the search engine - - - - - + + + + + Search plugin update Oppdatering av søkeprogramtillegget - - + + Sorry, update server is temporarily unavailable. Oppdateringstjeneren er midlertidig utilgjengelig. - + All your plugins are already up to date. - + %1 search engine plugin could not be updated, keeping old version. %1 is the name of the search engine - - - + + + %1 search engine plugin could not be installed. %1 is the name of the search engine - + All selected plugins were uninstalled successfully - + %1 search engine plugin was successfully updated. %1 is the name of the search engine - + %1 search engine plugin was successfully installed. %1 is the name of the search engine - + Search engine plugin archive could not be read. - - + + Sorry, %1 search plugin install failed. %1 is the name of the search engine - + New search engine plugin URL - + URL: @@ -4799,54 +4923,8 @@ However, those plugins were disabled. subDownloadThread - - Host is unreachable - - - - - File was not found (404) - - - - - Connection was denied - - - - - Url is invalid - - - - - Connection failure - - - - - Connection was timed out - - - - - Incorrect network interface - - - - - Unknown error - - - - I/O Error - Lese/Skrive feil - - - - Could not resolve proxy - + Lese/Skrive feil @@ -4908,12 +4986,12 @@ However, those plugins were disabled. Kunne ikke opprette nedlastingsfilstien - + Invalid file selection Ugyldig valg av filer - + You must select at least one file in the torrent Du må velge minst en fil fra torrenten diff --git a/src/lang/qbittorrent_nl.qm b/src/lang/qbittorrent_nl.qm index ff1480b5b75e71a1462f345bff824118ab692119..4557f2851c975b8f20929f108c80e91ae82c0730 100644 GIT binary patch delta 2025 zcmXZdc~}(Z9S895%RFmCLX;5FmnpQ2|8~Y7zlgKt(WKNC`y=a;TIT zi4gD=)QCAm3{gS}2peo^F2Z3&5jiw5hzM0cE^Fgci8Vi;>0h5`cJ@7f$NSFhBGqu7 zs?gRo3cymJ?H54w1Af{{h6CTK0cjcV;xyorN$=~5{GH;ingb!Hf%me3(0zc{sAA0& z*#zVS0*3~G6!&NRg9%MjL&}00-_HA7tR3dzXMv+i@w)$y+uO? zzUMV&$LZ%xLR{emH2mKy>y_tWJ$r?7e)$%}Peh=@UGdgiilYvSll1R1kAapfh?TTt zfEH#Z3hss*)ES$A?>=XB+#Z)G(cNzsY38y#(~Z+m>nO?f9c6$ z_|0+W6A^K!7#Kc+$gSy=nlwa~{FeetMpW2CAjO2Jyr+QA?-f_|DAw&z9I=D3;s~&< zLeXTSI2sD$FBz1GIOZ;dtEbWE@;z`VndJ&j{74%6T+nkJtX=SN?d8I{pQCKQtyo>l zy`S|z;AACt_!w0n>|@2zcIK{{tEtc7>Q~tUBTa0L%8=ca!wt9|2lj8`hCh7+xcx`& z>7HwVbvpGn2ADSo$>%GO<|IPS#n-xvrj!hhfoROC}Tl32ynSk~^?1>os+>Jj8g}MfyCsQbS)|H>Q2&KdOfhCc`$ymzSeLI$57RVK_ zagyl=KY(7;rZ~YcH z@1Qsw!s;Y%{&FN6lMMFtj$#C(*4VK@@qItVo1V~cOg{V>;M5?#opg~J@r0ON z6btlk7jyO|01Ms|b7xb7e!Yrin)|#^E}nSz7%=!qaU@i%6b{lk{8+5{nr2D3qF7U` zcrT3&nR{z$gT<>E=V-efY`)rCXIf%r|0*4y{{JYBrm{q}UfplD?3*8et4*v}9l^In zurc)ku92l`oE@J^x`%rxJIRW7$EBHTLVewA9U#ge-I=bV4sn(SjTZomOmTX~wTJ@XozD~tFDVYn7RK$glBtyCT5skX=CLvBaMuU2BvR3C ze;`{56luwI*`_oPC`^|fBB`jkw(`7neZXa&CD`b*%j9)c^8js=9P4`#IA|-!C(?z! zAxTas^QD5lDDNnt_fgyA%p)n(W+QTr`ZQ3{DwhsirtjN!`JBa{DO1bk+JCJD+>gsm zt&0I0UcR=|jv8>0+^f%`UF?^y>*y?X3W{SP^5b`CJU=wTWZf>!;4;g7{nW7c*Rgz^ zL3iP|mbK@oGqulK{>_gH)3BGd>kRyqCwrm`_r=7ytkO delta 2721 zcmaKu3s4hx9>>4gWLc6Bkf?wtB=#y0E%6O?v`{M`K9KQR5Ec@fG}Am1WDcfn_%Ee18!6+L0r!iLGWjuJuR_YFFM-HEh@AAj z$i2-XT_s2@TLox;RvLvp*eE{67k-VJW0Q9KjJZJX?=7n=!!xsXB`*VI_slbhLZorgFz^FiO%-4D# zrh|(fMwL4D4=(!DK;TgW7vI?qXcD+g%b^?(7Z;?)4X>1yu8>2+-o+nLN zNSYVNNK-Zj0_XJ78FmV0;0@`F)+#!G#9H{cH?FiwSE~<@?CdW4k<5nOE@YZUZ>`!@5*j2goHp~%lii~O;i1$k<8 z27dP1T|meIey;Tlwc!@NcuhL+Qxm^*kr5d58NV!m+VjW>X7r348pLn;GfjE3Rix`U zUm;xqoC)Cf93?BpI+1%+BJXyvTF(f@p2K|of^wiWo~h&!>dO5dfm3K?Zq5?f*3OdT z8hMJxxMNp=`Z26Xp3K#pXN~gZl94P;5!$~{P(Pke>bOMS%@+KUCIYu11h$Ycbw9A3 zipV}@A>WT$ZtW!@f7ncV0jv-T%A)A5I`)KYj1|^NDUq{5!ulu|i5MtsbI}V)eMi{7 zwhd^S#NJW*4^0%DX_S8R4&l%uD&yM`!VUi>AVn`UJ>N%9ZxfnRzXiOCgx10snsgm2 zQU-G;ce7H$r6cT+GLE~wiSb@hiu$LX2ba)jJQ&Mjy#^1RD)(4_8rW+Qd3~eE&QiJW z@KHd!NgkN@7}y;x*R9N@s3)>gufdXJR_mpi`o27U1r1lkEs=ZwF0#%f^7=)QolWxD zlAD0ORG#mO1&*JU&sp|0y-H`xi^j|YeCEg(y);qOKeLgl@qOau_hpShjzQ$!ULswQ zY`rQ(-5I3t8`ez5zE^~OM^c=6m({BD+{NSUg({tEe$3Lm{dK&evViVs8KkJH`~rBm zOVQY@0N%`0G_Q&WE|iJv2xX<-5nR4_DEWxMHSE)Re(n;@$Q02L_9P%WvMjt(QzmxGjLi^9~ z`eX7c;FDbgS8>C{{iDgr0B7WVOBpil&3!i*Hg- zK42_Ctydpd@9iw7=2O1qeQ@+Mn(P0t61ARtoW~BSqa{3hp-$FZZuDtgwF~&6pHIiN z_kh?;pQmwY!1OFq?8#uKt>=MnoX+at(X8)t1q(EJM`y!|d^kMm+YArd)Z?rci!sY# zvRbs+876bS%_z{auRT9A##(4GTQdwFAGD8#F=8uMy*>dx7%!MzQv#o8!=>r?ln%s z5Km^^PPLSTo%UAt;RC8o4uZ=jhh5uxllcLa@-8`)W3|Ll%tParB*F$+FsP)LdGN(NSo%7! diff --git a/src/lang/qbittorrent_nl.ts b/src/lang/qbittorrent_nl.ts index 32a0cccbf..cf8353697 100644 --- a/src/lang/qbittorrent_nl.ts +++ b/src/lang/qbittorrent_nl.ts @@ -3191,6 +3191,10 @@ Changelog: Expand all Alles uitklappen + + Skip file checking and start seeding immediately + + authentication @@ -3603,6 +3607,101 @@ Changelog: Typ op zijn minst één URL. + + downloadThread + + I/O Error + I/O Fout + + + The remote host name was not found (invalid hostname) + + + + The operation was canceled + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + The connection to the remote server timed out + + + + SSL/TLS handshake failed + + + + The remote server refused the connection + + + + The connection to the proxy server was refused + + + + The proxy server closed the connection prematurely + + + + The proxy host name was not found + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + The access to the remote content was denied (401) + + + + The operation requested on the remote content is not permitted + + + + The remote content was not found at the server (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + The Network Access API cannot honor the request because the protocol is not known + + + + The requested operation is invalid for this protocol + + + + An unknown network-related error was detected + + + + An unknown proxy-related error was detected + + + + An unknown error related to the remote content was detected + + + + A breakdown in protocol was detected + + + + Unknown error + Onbekende fout + + downloading @@ -4703,23 +4802,23 @@ selecteer alstublieft een er van: subDownloadThread Host is unreachable - Host is onbereikbaar + Host is onbereikbaar File was not found (404) - Bestand niet gevonden (404) + Bestand niet gevonden (404) Connection was denied - Verbinding niet toegestaan + Verbinding niet toegestaan Url is invalid - Url is ongeldig + Url is ongeldig I/O Error - I/O Fout + I/O Fout Connection forbidden (403) @@ -4735,23 +4834,23 @@ selecteer alstublieft een er van: Connection failure - Verbindingsfout + Verbindingsfout Connection was timed out - Verbinding verlopen + Verbinding verlopen Incorrect network interface - Verkeerde netwerkinterface + Verkeerde netwerkinterface Unknown error - Onbekende fout + Onbekende fout Could not resolve proxy - Kon proxy niet herleiden + Kon proxy niet herleiden diff --git a/src/lang/qbittorrent_pl.qm b/src/lang/qbittorrent_pl.qm index 02b7abb8a028390279180de43e922a7c0657776c..967df4617bab6473018b58d953179d62ef32827e 100644 GIT binary patch delta 1795 zcmXZcc}x^n90&04%+4_EF}neUmGvMf>;f7UDAI~TsV?9FMvFpGtW>Dtfeoi3hYFM% z#mAu)v>?c`93~~z76q+<)-uzPo;5!56;as3d zL~!0CfDDsCZVtc0Kx95VIyDKaN~-`%2O<+P0K+IEtN#TioUoG^A~E>L}mhzgU}S#Igz zRGQ{oW>P-ayf+<)7~@VX84oPD!AxJrY{?`s3RBJ%?tXIwP=A~Az>ER zL1fY7H7I;!o(b%#6{4391M77{a^_Q@Do@CfdVoFQ!tSHLQip|tm2JR5KN2s_^5_+6 zPYOV?j@g_gG+2u1@w=$BJYKd!Lt6llqb1#Rj}f75MibE7D)gvmOqxL9Y-~7SS|arA za07Pi5zZ%^15$NN%QE6%mT<96K}WFU7xAmJEi|n~%oGP^ z^9?dt3b5Zk(Z&!?8>-&Sv`!~mB|UeaIj&p`G!#mPyEM>> z3uL~naq$s%Dbp)q4Y-j*U{9g=XdGYAM$`2IxPNN*uj_bzV~GLRIr{{#B{5NWs72lYsuF>8S)AE|p6t(eg&-PDf&-mj&R7hlu%FOcp; zcL7|v^vW^-jN4#q_iQ;`{g&$MZIn7>`XM?oIqJnt2|#T%xvO^Os)(qGv};$N zk9q>MkEk!jYy?^_lC7GVd{RHD)0kX3H7i!pw1)LESKeSY>NU}u=|m+T|(ymmC?8r>tn0BX6m81$^ep zS(VB3lCYO^m5soraJf~J0vt+{`@WwC*aXSf5*=v2Z3KVqDSz688UAEcYvhmn5eMBY?k{52g*d*_-7BYK zaqy+?d2kHyjxSBj@fV#9x}qdSPH*q9U_8`o*v U)9Xi$)h{EvdM0)%doBzA0ZLgYZ~y=R delta 2648 zcmaKtdsGzX8OEQPonhF^KqQJlj4UZEphf{fA}X|^fY*3K5S3(Q7hQo}-3u2Zpdu9% z2>2;p@CK+{1TWzzr<$0gqNbkO9_t~Rq{p<;v}z$N?dRv~I46GDOr|2NDkg^R@uf*VDiM zROt8wnDrOh^#L%qpLc=z#4Wm-%AoFr*Cn#*HV?kVSco@Wb5vWls+@GMZB}w6l?GO+50cA6wUYh}I+|3HP z@&4m|HUh1WF!jR*AZiq*epW(z-ax{}F9DXyE_37f{AwohvzIwR+giD%H}il6ecY)TgMs*u z6y|=Yu=zflr3x-i;O;an0O|*GPv5voCVt23#ufqo(|GTYG+^K7d|bqEV8bmw?!pM* z#1%g2eh=W)z^7SB)nHOMLdEBXBvZrU`8+LIQ7b4smdS50#sQ;V;x{!{l4~)1*&ee0 z)mDDT!!By%7pmv@wI|tQRbsfHn!0ov5cdNef-1F$x;O2zDs_h+m0hh`;-D0U-Bm5Q z-3e4JXD%Vy_Z3yO*Y7CcHC1i@44JH|z3C*}@{pYu#&ChGR|pQDAuO6oX_0|@^_mNm&yF>%_ zH?g=T9XJprmaH=aFTN?3`q1F5e~z`g1&8xuUD;0Hpi5zMm)NE%r{gt8eCs_@i7Qv= z*rKrMRVGTYBl2q8{ASa59XO+~rQU7i845PE$1VCF`>3L?+~VK=7})w6%aP(ZH`Y$~ zNvuaQcoh~&-pSKxnx060pHnkxCb1xQL-D?SlFPdYNcmK9MJ%UNbVJH*rp`57kxE+o zNO_gC#XB5$JzT2z^A2*hMcSsKGAb5H+hgwl+H$FW>s_F6zSQ{80!+Lu9UD$zl8#8n zc?RT0N*zn74F_AKch-^5hF0mu(3?QS6Y1u6CovKgkEL5_rva`?x}7(LrgWF|xcM^h z{Brj}U(cn$pSr*3Qw3~tXFcw*e8X<`vN~8D;C^NU9gX%AELm-cs4G;vZT|z{GArEM zsqlEEdeGSMz>#jXU)I+&E}iPoij`E{baqH>;I~w<%WD5=tJUe{bi9H(6}t8-tiGyn z?^gip89^p6^!_b6Wq;_oDrAhrn1XgEgmh8U)nBUfz57V^7mTHzi@uf5PFLquN zH-4DrXe^oGm#T1KhvxXjR-kUI=2R}J9h$G{Jhcxvc1&}tDv9ie!uD_3B&~tZ?_y@H ze`vgR*f84M_*fefK#u9Y(MG)z0eGZp6Gzt38Sd3iKSXux(Xn=|Kc{7vwJC#srM-}P zpI$AV+CMH`0UYgRQM%E5yNQ`~!2zMVc?-#zS?3fcf26RnQkRxRf%3j!?Yh@EBa`KX z;)+YMB$CbbnX-q93SYcf9+q+vnCUGCE~dh(K9+;3&H*uH3Ul6;$8|peEM9Wb7%F{# zp1k;IAbrvPE~m#_0_F^tO*tjB|DtSej3M1NIlGqr9~&bVZgT+TWpau7Ah2?_T#?j` z31~}{kLaAh?t60A2NMCe-^f?3L+Hfy%GdmhC?QV1?nNhZ>u!ZdGvvPC{)u`^-w}^Y zzVRH(@fb7cb&rlC>6FC;k24b}tAZ1(-NV4YmBG3_#&B6o^i1@2c;2pR0e0Cvze!jM zL`G3hJAylwd6wHdTpP|ttB2E9*$yMJSa_H>)A^{2z2a?Ft2x7Iv03$*MoYHKZk8y> zAct$&6kDD(+h#N^SYbCCO`M9BLof$6ZZan#18ZQ06&AYdVS|Zu*T6;VHd-~i(`LBQ zHRQka^NbF?$!xWlO#>lDJ{w~+lCg@Li~?9Wk*NPZmJyC0bB^-)KTW44$86HuT+RX6 zXH~`lo$;MvA&;EooE@2TUrFkE zy86A$fMp=t7p7S=Y<4?Mhu&&-=Gp97dW+R*wr3hMeu~L_HzcL~Ot8V2OvBExpand all + + Skip file checking and start seeding immediately + + authentication @@ -3710,6 +3714,101 @@ Zmiany: Proszę podać przynajmniej jeden adres URL. + + downloadThread + + I/O Error + Błąd We/Wy + + + The remote host name was not found (invalid hostname) + + + + The operation was canceled + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + The connection to the remote server timed out + + + + SSL/TLS handshake failed + + + + The remote server refused the connection + + + + The connection to the proxy server was refused + + + + The proxy server closed the connection prematurely + + + + The proxy host name was not found + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + The access to the remote content was denied (401) + + + + The operation requested on the remote content is not permitted + + + + The remote content was not found at the server (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + The Network Access API cannot honor the request because the protocol is not known + + + + The requested operation is invalid for this protocol + + + + An unknown network-related error was detected + + + + An unknown proxy-related error was detected + + + + An unknown error related to the remote content was detected + + + + A breakdown in protocol was detected + + + + Unknown error + Nieznany błąd + + downloading @@ -4816,23 +4915,23 @@ Jednak tamte wtyczki były wyłączone. subDownloadThread Host is unreachable - Host jest niedostępny + Host jest niedostępny File was not found (404) - Nie znaleziono pliku (404) + Nie znaleziono pliku (404) Connection was denied - Połączenie odrzucone + Połączenie odrzucone Url is invalid - Błędny URL + Błędny URL I/O Error - Błąd We/Wy + Błąd We/Wy Connection forbidden (403) @@ -4848,23 +4947,23 @@ Jednak tamte wtyczki były wyłączone. Connection failure - Brak połączenia + Brak połączenia Connection was timed out - Upłynął czas połączenia + Upłynął czas połączenia Incorrect network interface - Niepoprawny interfejs sieci + Niepoprawny interfejs sieci Unknown error - Nieznany błąd + Nieznany błąd Could not resolve proxy - Nie można określić proxy + Nie można określić proxy diff --git a/src/lang/qbittorrent_pt.qm b/src/lang/qbittorrent_pt.qm index 937345335390b891eb987ce81c09a9e4bd4fde0f..b04d210f114c6422dd15b07f9f76bb32c8479358 100644 GIT binary patch delta 1833 zcmXBVdsGxv90&04%+BmEyX@jF>Ix|v9dTVXC<@7xB{e`)&{AHTSQZ98sg$$?#0L=` zHSs6-#C%a0kQKrzMWqRqiKR%I2a*s{hy_!`lcjb&_n-Zo-E-&e@BSWl?iEW%ili+A zeck{t322Z3c|7pPi_96osmy}MEy5QC5jLTsV2LIA7%=q|koz7GbDk~t2VQvSWMI}q z=K~4rfKmInugn6R4}Z@C=4=FNUj|xT2cOqLBR zg=uD}zoK?z9q@B26>3I^y^m0>#wu*07EP%C9$|XZW5D#i!Ux&+fqnVH)*USUu~)e_ zR#KScr#n7IsGc?u=uM^hQlRdBx}-aF(CE=@a!6K!l!{i zWQQ0Y?8hoxDu&mO0{Y{{DL37K^^WLV$~GG}kvn6fxI)h=^IH`6R)x5BUO4b#oS0X- z2{@BS0dk=DjW@-~bDd4kYsRK$1A`ozusM@ilRVAsc4)#IqJgya-0EOWL^AvS`Zey+ zbDG5LTp*`Olepa%_$5d)XBmrX^eN4p>n`A&kqp{MT}zB+i}^Tk`8i6~T7<7DLmMuv zpek)(@QJ6SqzHDd6U~zIg*M|rZ|wrEPgf4!SpcL=Q;ztty|X7N zpNRw<%T_9rSw1??Dz!PRs^fMlzgw=d%S2JG{#(U{Wrx!4tN}dJsX}iRE>VNtPy9_J zw?0Z(MIoNyLK0$i3~M`Y!5YN6S|28yB)*AEy@2AfcBG25a;g zb#8tmn`#Hwb&cEj8MiH(dplNrQ)mT(9;g|e5kTD!>dM?t+1+?l&6>b&3$L@3Wr*_0 zS9_!;V8LHpS2VXLjam#N%zevsgM-_FC!W=f{GOfj$L%!8I99x9qZs2{vCB>sMvFa7 zSN%3y)AfqZRlOIubzj%it^)$5=-M|=VRdNY-W*PD_UxBqD8S2R-=QBmls(k>n0}-` zOSDgtKIEBT!1tm)YV>Y4V7v5FOIYGt6DY&WCX`XJ*9y~GeSP9h;PzJindCI~M-B=Y z5GYm_QQQEVaFDVFSk%p)&P8n7niwh`kSbgu*)&6a&7jDv79D?4vdJnOp)B^i z*6dBExHtD2?!L!XcNJ2Ad9`}RxTckL)Zax^VGc6=VyrAEiTxDYMhwnm;e4GWGk>VXlQ90%`vTurFQx delta 2744 zcmaKuc~nzp8pfZSg_|1)5G)2LZDL0@MR2HqR)M3);(|&Q1S(d9AgLj-SwJlcRnRG; zR{X@Zc3PK;RmaYNpjCU^9i5^ridx0i1**6}6_kqgIB$Ae&p3|#=jPy z9SM0NE!vwbvf-%6J5yN-7ceve@=xW!=`|v+y)CjmU*yA2ApfizIPoXQw`~Msmcyxz zs&Co~p(qh z(tIj(-a(98lS8Z2826a~bS`IhN$NYbN0GXy61dZfiH6xgP!T4scu0MZKw3f>&{2f6 z(Vc*O2-3=*00T=zj`0&&cS>ZN4H;F-0b``d-FYJ0*COMWB9fz?^^=YjO0h5S2yki% zE0g+5+K#jBQY|-_)k`DQBe~IyuK}Y!7TKX?Dw!t8pW7H5Mx*iPHh)+MEL*_Uj(Q20 z-XwC@1(EHZEJ+sPaqb>>HE1upysQ}D%@oPPs>S4na3+_BNWMD2!sU}Q&fJqmnCAkX(b6aq z8%YC1-nuP~sUHF4m5SVXSsIr~pL4H^tSOeJ%_S{M8l`C~eW?3O(n(gTr0-$rq#Jd> zH+$I~dAzdek#woYZs5B%7UiVjj4Z_|hVx^UP9b6YugKElLVyG1vW(=b!1@xIwWtF) zw^3Hie+3-!m%YECiC80Bn6i!RqG0!(LW9a>AJxf#>J=hy)yURYm6M;tiJv=sEnB}W z8rVOOCGq~snzOQP!JB~Fi`g7rqxO;=H5>$Lvqj!1XPfv4$+!F2B|g-9raYC=RP#GT zR&yjp3|Jn8K0)Um4vB zXm0X%~3-JO42RS)PI6v`bfK-?^ax-%JIYn_E&3lzZ} zW?+Ieti&dFJADO-U-wM3qgzCA!RPIO)jC_I@ai-O`a`G{@^s72GJtxDn*{2 zEb>a1$e+&$?{b%c&?kbuHI9z20%2y^-|5t?5#|h`)5h(jQ1XNnx_gmDsS>;+g*I6u zV7Mi+wo7DNPqt3w@6pw*>>1V!^nXJcc#LE_9>*G05t6fwOyxRR(t3{NyJ~`ZDr*a9 z%}rNjUG2v}SE;hGSqb0Re4#?!rcP6be8E>sP6B4H0>UpCSJ~8XXXJ94zm`w z5J^Wn^K=j3l3A3yMi}CfF`dHhe#A1}r*Vtf5%;lzTE)w0v@NUID{3v5$)f1Klx3>5 zh6I&yMQ<{}P}Q8}R{CN2t7^Wm5!l*SwJ4E9xwlvK(bbc{2%BoFiw*d`PF4M5IuO#T zI{dF8fI35U+T=-Q^i`eHl4Vz?tIm7Su4=T1e9&9fy@0-dGnQRa7Ynmp-@i=Oz3FuGL$~kj_4?dj@v{dwyV>JVGSh1+38{TGG(TJbR>SFE+T{Sh5AU)X(jwreQ$B zD7OdknZR2ENSa5ztIK<=sje)!t-rWpo`?Z`8Y;^!bs zj9pC2J^w3sVU|^wqc<7!Ie!p8Qz$I*w4a^+(N%ul=U`kzELLw>P7 zM`yO%{xI2?--MY#p>rsx4i>swDTxsU^kktoGw5z631>Y`rinG%jX64#*`~ATt!86^ zUN^&Ho;mB;RPN6RHxNVFlXgw9o`lM#cqVGX@~d2qh5|7F{pkvNn!_vJVASgznmN+s zn(d|>UEqNJ1A?AS@=T6C7)!AnF$l=4j0LG*OR4v(=_E zSao(2O*uO+YpU@%1F&9Gl8ay9h%mhAh)3bC|0X6mfD$`|6eV?(;Aq+M>pR=;{vdn2 zJi?T1wphr0I+Na3Xtqq(8B8|4B{wVkxf+~A7c%X!*wQ>6QRZjl_qRmM> diff --git a/src/lang/qbittorrent_pt.ts b/src/lang/qbittorrent_pt.ts index 1807257d9..9a48bf137 100644 --- a/src/lang/qbittorrent_pt.ts +++ b/src/lang/qbittorrent_pt.ts @@ -3198,6 +3198,10 @@ Log de mudanças: Download in sequential order (slower but good for previewing) Baixar em ordem de sequência (mais lento porém melhor para visualizar) + + Skip file checking and start seeding immediately + + authentication @@ -3622,6 +3626,101 @@ Log de mudanças: Por favor digite uma URL. + + downloadThread + + I/O Error + + + + The remote host name was not found (invalid hostname) + + + + The operation was canceled + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + The connection to the remote server timed out + + + + SSL/TLS handshake failed + + + + The remote server refused the connection + + + + The connection to the proxy server was refused + + + + The proxy server closed the connection prematurely + + + + The proxy host name was not found + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + The access to the remote content was denied (401) + + + + The operation requested on the remote content is not permitted + + + + The remote content was not found at the server (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + The Network Access API cannot honor the request because the protocol is not known + + + + The requested operation is invalid for this protocol + + + + An unknown network-related error was detected + + + + An unknown proxy-related error was detected + + + + An unknown error related to the remote content was detected + + + + A breakdown in protocol was detected + + + + Unknown error + Erro desconhecido + + downloading @@ -4683,19 +4782,19 @@ Portanto os plugins foram desabilitados. subDownloadThread Host is unreachable - O host é inalcançável + O host é inalcançável File was not found (404) - Arquivo não encontrado (404) + Arquivo não encontrado (404) Connection was denied - Conexão foi negada + Conexão foi negada Url is invalid - Url é inválida + Url é inválida Connection forbidden (403) @@ -4711,27 +4810,27 @@ Portanto os plugins foram desabilitados. Connection failure - Conexão falhou + Conexão falhou Connection was timed out - Conexão esgotou o tempo + Conexão esgotou o tempo Incorrect network interface - Relação da rede incorreta + Relação da rede incorreta Unknown error - Erro desconhecido + Erro desconhecido Could not resolve proxy - Não pude resolver proxy + Não pude resolver proxy I/O Error - Erro de entrada e saída + Erro de entrada e saída diff --git a/src/lang/qbittorrent_pt_BR.qm b/src/lang/qbittorrent_pt_BR.qm index 937345335390b891eb987ce81c09a9e4bd4fde0f..b04d210f114c6422dd15b07f9f76bb32c8479358 100644 GIT binary patch delta 1833 zcmXBVdsGxv90&04%+BmEyX@jF>Ix|v9dTVXC<@7xB{e`)&{AHTSQZ98sg$$?#0L=` zHSs6-#C%a0kQKrzMWqRqiKR%I2a*s{hy_!`lcjb&_n-Zo-E-&e@BSWl?iEW%ili+A zeck{t322Z3c|7pPi_96osmy}MEy5QC5jLTsV2LIA7%=q|koz7GbDk~t2VQvSWMI}q z=K~4rfKmInugn6R4}Z@C=4=FNUj|xT2cOqLBR zg=uD}zoK?z9q@B26>3I^y^m0>#wu*07EP%C9$|XZW5D#i!Ux&+fqnVH)*USUu~)e_ zR#KScr#n7IsGc?u=uM^hQlRdBx}-aF(CE=@a!6K!l!{i zWQQ0Y?8hoxDu&mO0{Y{{DL37K^^WLV$~GG}kvn6fxI)h=^IH`6R)x5BUO4b#oS0X- z2{@BS0dk=DjW@-~bDd4kYsRK$1A`ozusM@ilRVAsc4)#IqJgya-0EOWL^AvS`Zey+ zbDG5LTp*`Olepa%_$5d)XBmrX^eN4p>n`A&kqp{MT}zB+i}^Tk`8i6~T7<7DLmMuv zpek)(@QJ6SqzHDd6U~zIg*M|rZ|wrEPgf4!SpcL=Q;ztty|X7N zpNRw<%T_9rSw1??Dz!PRs^fMlzgw=d%S2JG{#(U{Wrx!4tN}dJsX}iRE>VNtPy9_J zw?0Z(MIoNyLK0$i3~M`Y!5YN6S|28yB)*AEy@2AfcBG25a;g zb#8tmn`#Hwb&cEj8MiH(dplNrQ)mT(9;g|e5kTD!>dM?t+1+?l&6>b&3$L@3Wr*_0 zS9_!;V8LHpS2VXLjam#N%zevsgM-_FC!W=f{GOfj$L%!8I99x9qZs2{vCB>sMvFa7 zSN%3y)AfqZRlOIubzj%it^)$5=-M|=VRdNY-W*PD_UxBqD8S2R-=QBmls(k>n0}-` zOSDgtKIEBT!1tm)YV>Y4V7v5FOIYGt6DY&WCX`XJ*9y~GeSP9h;PzJindCI~M-B=Y z5GYm_QQQEVaFDVFSk%p)&P8n7niwh`kSbgu*)&6a&7jDv79D?4vdJnOp)B^i z*6dBExHtD2?!L!XcNJ2Ad9`}RxTckL)Zax^VGc6=VyrAEiTxDYMhwnm;e4GWGk>VXlQ90%`vTurFQx delta 2744 zcmaKuc~nzp8pfZSg_|1)5G)2LZDL0@MR2HqR)M3);(|&Q1S(d9AgLj-SwJlcRnRG; zR{X@Zc3PK;RmaYNpjCU^9i5^ridx0i1**6}6_kqgIB$Ae&p3|#=jPy z9SM0NE!vwbvf-%6J5yN-7ceve@=xW!=`|v+y)CjmU*yA2ApfizIPoXQw`~Msmcyxz zs&Co~p(qh z(tIj(-a(98lS8Z2826a~bS`IhN$NYbN0GXy61dZfiH6xgP!T4scu0MZKw3f>&{2f6 z(Vc*O2-3=*00T=zj`0&&cS>ZN4H;F-0b``d-FYJ0*COMWB9fz?^^=YjO0h5S2yki% zE0g+5+K#jBQY|-_)k`DQBe~IyuK}Y!7TKX?Dw!t8pW7H5Mx*iPHh)+MEL*_Uj(Q20 z-XwC@1(EHZEJ+sPaqb>>HE1upysQ}D%@oPPs>S4na3+_BNWMD2!sU}Q&fJqmnCAkX(b6aq z8%YC1-nuP~sUHF4m5SVXSsIr~pL4H^tSOeJ%_S{M8l`C~eW?3O(n(gTr0-$rq#Jd> zH+$I~dAzdek#woYZs5B%7UiVjj4Z_|hVx^UP9b6YugKElLVyG1vW(=b!1@xIwWtF) zw^3Hie+3-!m%YECiC80Bn6i!RqG0!(LW9a>AJxf#>J=hy)yURYm6M;tiJv=sEnB}W z8rVOOCGq~snzOQP!JB~Fi`g7rqxO;=H5>$Lvqj!1XPfv4$+!F2B|g-9raYC=RP#GT zR&yjp3|Jn8K0)Um4vB zXm0X%~3-JO42RS)PI6v`bfK-?^ax-%JIYn_E&3lzZ} zW?+Ieti&dFJADO-U-wM3qgzCA!RPIO)jC_I@ai-O`a`G{@^s72GJtxDn*{2 zEb>a1$e+&$?{b%c&?kbuHI9z20%2y^-|5t?5#|h`)5h(jQ1XNnx_gmDsS>;+g*I6u zV7Mi+wo7DNPqt3w@6pw*>>1V!^nXJcc#LE_9>*G05t6fwOyxRR(t3{NyJ~`ZDr*a9 z%}rNjUG2v}SE;hGSqb0Re4#?!rcP6be8E>sP6B4H0>UpCSJ~8XXXJ94zm`w z5J^Wn^K=j3l3A3yMi}CfF`dHhe#A1}r*Vtf5%;lzTE)w0v@NUID{3v5$)f1Klx3>5 zh6I&yMQ<{}P}Q8}R{CN2t7^Wm5!l*SwJ4E9xwlvK(bbc{2%BoFiw*d`PF4M5IuO#T zI{dF8fI35U+T=-Q^i`eHl4Vz?tIm7Su4=T1e9&9fy@0-dGnQRa7Ynmp-@i=Oz3FuGL$~kj_4?dj@v{dwyV>JVGSh1+38{TGG(TJbR>SFE+T{Sh5AU)X(jwreQ$B zD7OdknZR2ENSa5ztIK<=sje)!t-rWpo`?Z`8Y;^!bs zj9pC2J^w3sVU|^wqc<7!Ie!p8Qz$I*w4a^+(N%ul=U`kzELLw>P7 zM`yO%{xI2?--MY#p>rsx4i>swDTxsU^kktoGw5z631>Y`rinG%jX64#*`~ATt!86^ zUN^&Ho;mB;RPN6RHxNVFlXgw9o`lM#cqVGX@~d2qh5|7F{pkvNn!_vJVASgznmN+s zn(d|>UEqNJ1A?AS@=T6C7)!AnF$l=4j0LG*OR4v(=_E zSao(2O*uO+YpU@%1F&9Gl8ay9h%mhAh)3bC|0X6mfD$`|6eV?(;Aq+M>pR=;{vdn2 zJi?T1wphr0I+Na3Xtqq(8B8|4B{wVkxf+~A7c%X!*wQ>6QRZjl_qRmM> diff --git a/src/lang/qbittorrent_pt_BR.ts b/src/lang/qbittorrent_pt_BR.ts index 1807257d9..9a48bf137 100644 --- a/src/lang/qbittorrent_pt_BR.ts +++ b/src/lang/qbittorrent_pt_BR.ts @@ -3198,6 +3198,10 @@ Log de mudanças: Download in sequential order (slower but good for previewing) Baixar em ordem de sequência (mais lento porém melhor para visualizar) + + Skip file checking and start seeding immediately + + authentication @@ -3622,6 +3626,101 @@ Log de mudanças: Por favor digite uma URL. + + downloadThread + + I/O Error + + + + The remote host name was not found (invalid hostname) + + + + The operation was canceled + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + The connection to the remote server timed out + + + + SSL/TLS handshake failed + + + + The remote server refused the connection + + + + The connection to the proxy server was refused + + + + The proxy server closed the connection prematurely + + + + The proxy host name was not found + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + The access to the remote content was denied (401) + + + + The operation requested on the remote content is not permitted + + + + The remote content was not found at the server (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + The Network Access API cannot honor the request because the protocol is not known + + + + The requested operation is invalid for this protocol + + + + An unknown network-related error was detected + + + + An unknown proxy-related error was detected + + + + An unknown error related to the remote content was detected + + + + A breakdown in protocol was detected + + + + Unknown error + Erro desconhecido + + downloading @@ -4683,19 +4782,19 @@ Portanto os plugins foram desabilitados. subDownloadThread Host is unreachable - O host é inalcançável + O host é inalcançável File was not found (404) - Arquivo não encontrado (404) + Arquivo não encontrado (404) Connection was denied - Conexão foi negada + Conexão foi negada Url is invalid - Url é inválida + Url é inválida Connection forbidden (403) @@ -4711,27 +4810,27 @@ Portanto os plugins foram desabilitados. Connection failure - Conexão falhou + Conexão falhou Connection was timed out - Conexão esgotou o tempo + Conexão esgotou o tempo Incorrect network interface - Relação da rede incorreta + Relação da rede incorreta Unknown error - Erro desconhecido + Erro desconhecido Could not resolve proxy - Não pude resolver proxy + Não pude resolver proxy I/O Error - Erro de entrada e saída + Erro de entrada e saída diff --git a/src/lang/qbittorrent_ro.qm b/src/lang/qbittorrent_ro.qm index 03db572648946ce7618e8d3512d52aebccabb009..be2db575e89182951d1e89081e76d8738b94ccdb 100644 GIT binary patch delta 1994 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 diff --git a/src/lang/qbittorrent_ro.ts b/src/lang/qbittorrent_ro.ts index 809e7b7e1..53e3fa4d3 100644 --- a/src/lang/qbittorrent_ro.ts +++ b/src/lang/qbittorrent_ro.ts @@ -3027,6 +3027,10 @@ Changelog: Download in sequential order (slower but good for previewing) Descarcă în ordine secvențială (încet dar bine pentru preview) + + Skip file checking and start seeding immediately + + authentication @@ -3451,6 +3455,101 @@ Changelog: Vă rugăm să introduceţi cel puţin un URL. + + downloadThread + + I/O Error + Eroare de intrare/eşire + + + The remote host name was not found (invalid hostname) + + + + The operation was canceled + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + The connection to the remote server timed out + + + + SSL/TLS handshake failed + + + + The remote server refused the connection + + + + The connection to the proxy server was refused + + + + The proxy server closed the connection prematurely + + + + The proxy host name was not found + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + The access to the remote content was denied (401) + + + + The operation requested on the remote content is not permitted + + + + The remote content was not found at the server (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + The Network Access API cannot honor the request because the protocol is not known + + + + The requested operation is invalid for this protocol + + + + An unknown network-related error was detected + + + + An unknown proxy-related error was detected + + + + An unknown error related to the remote content was detected + + + + A breakdown in protocol was detected + + + + Unknown error + Eroare necunoscută + + downloading @@ -4520,19 +4619,19 @@ Numai acele adăugate de dvs. pot fi dezinstalate. subDownloadThread Host is unreachable - Calculatorul nu poate fi accesat + Calculatorul nu poate fi accesat File was not found (404) - Fişierul nu a fost găsit(404) + Fişierul nu a fost găsit(404) Connection was denied - Conectarea a fost interzisă + Conectarea a fost interzisă Url is invalid - Adresa URL nu este validă + Adresa URL nu este validă Connection forbidden (403) @@ -4548,27 +4647,27 @@ Numai acele adăugate de dvs. pot fi dezinstalate. Connection failure - Conectarea eşuată + Conectarea eşuată Connection was timed out - Timpul de conectare expirat + Timpul de conectare expirat Incorrect network interface - Interfaţa de reţea incorectă + Interfaţa de reţea incorectă Unknown error - Eroare necunoscută + Eroare necunoscută Could not resolve proxy - Proxy nu a putut fi rezolvata + Proxy nu a putut fi rezolvata I/O Error - Eroare de intrare/eşire + Eroare de intrare/eşire diff --git a/src/lang/qbittorrent_ru.qm b/src/lang/qbittorrent_ru.qm index 77a04b0e919fc297f14a6b1e9d49692247d9b196..c2197db2fba8b862c23d60361db1f50ab26b7baf 100644 GIT binary patch delta 1998 zcmXBVdsGzH9S895&g?MkEDN#*P$E!FcqXpF2R=|JF(4X1jN#E0P!v+BC^Z(S!4;Jl zidB?cggnHYfEuG{Z8(6SKzyM_QBe^hfun#5#N{Puv`y`gbN|`T+1;5t_xHNfc0hfj zNWJ$ppREAi1#Wx@J}G3t+{0pz(fwqqA@$FyCwt z+72=&mCM8qNFg(Ux<2lmQEq=Si&S|8K8N(J1T@!kyGyu(d%4f@Asv1RT!GmXkEsfgkZ0 zEq=Nh5nm6um%`9%S=Mls_Ilk?b-+Q4b+B5| zS!mOeVw)_t$iBf(31=S|PgF7^b%~v}sr;AjT@4p5N&R|LE zsaZ{`PA{tQXF;mo?>+<`C8}O!-Ue(B2$mb{08_nSHGK=-okj5EjskJ7z8Yw277NGP_0TzS ze=oJ}f|Fu#Jf&;z)6$fM*HbxD~&a9(2TWOt=1 zRbBS>A;4U~ie(4e3Ux#BIiT8-+rNihlzoLeTK2naSao`e6ve1FQfs+vDfht~De0Xc zVC5z$<;iqlQxy3U_+zNFzJ_*o*4zU_l{IzTs#31`0vomTRZbbCrp?D_ zAoOge##etP#=R9?%lQ4r!uQKeFF7IjSzULvf#cP9y6_ zGAVHxT(hriAGsKKd{}mTNEvD#VvUNgW4DEzW=}0r_)Jcl_GcQ~3_1M><+EoUbJDsi zw@q?^NU=0cWMNu|zyZ1Rc`}f+NB);Ht+h2sJ}EGurbRA~qYU(g$+cUl#(vx64u>va z`9ittKNWQMRk_<(16Y-^<639oY8GoG?lET81`9p2*-R^cp>+Z?SxxnNpt0C@g(~)v z+vUm~{inup?FdElv&L)JUnq(})^24GZiX_Q&SlX9O?)m*+uTXqni<^YY;Kp4J9S=+&)s)ZIeFYodb;)jjt<(Hv!?;C zS8Er(^)*f9dF|puRE-BIEX~GUxUz~B+obEe^0f^y!*qn$YOlqu0iL!ow{ZrcVu(eK z^KgA)^+8k~u=7i9!EfAN4=dwZdeoURRy^(_q3%s4*@i1kg*sWHvOTI{akeh1Q_Mu4 zO|00~+553kms0p9RX9gyD%eQpPJ}L7a}YSbOSixC`q%v=nilF44XGjIRE5GIP^!QF;@sx80{^8;)kj^#*;topt#!>MCup^=UuK zYF#=r>kY#5IOa6oUubq^apU7%+OuqW@@R}YezF<-%^jWEL9)aSSO}ttWQZzNc?ck$4Lo^tpAmJ`GG6T{i=SoRQ=WB|I8Si ArT_o{ delta 2822 zcmaKtdt8k99>+iP%x`9zsVNO9QH@?ySg9mkR9h(_DMY7LPHL=KHM6RzMQPo(U55^S zSnIYgxvX2x9#$=>bDd?l;We+B_ssA4&G+*8etyq$=391c zJzLVn`yhaD;51Pd1l&AA91T>@BYp=Av;q_nfd2@#5}MjQo- zoPbg1>C$x|-poINvBWc4U;>5th(ef|`U{X`UZ->u7Xeidfk{Vzn!u$s&cf+6OItjJ ztABDQiAy(s$f5_)j-etijuzQ+geOSc!{Q;^AOmW$#kq@Y zfZ1QNfykY`C_zUm`V^K^+YH#L;pqZ5j@E+!|%a<$A;IJkue%Tk0(M!rsF9~L1E ztr-sJPm3&XkVYoc@2P`DmgPtjXOrf0mrE1BbtI9>q!Y8LnEnpZiB09e`G4@ovMATO zR_PMWKH%B_=}NO{Hy@U+ZJrB6{3u;&8S(PrRYE2~mj1Kr}-!PHnFW)nL)qc>1#!>aX%fuARf zY-#4D3P0h3jyEbi9rqW>#&hzBu~H8I+681iG1E&IbCvt z&SaX>)Eo&Mzp4CU!7jQf$14kl%mg|ORet$ePstK_qc`{Tf&VtB%5v#H zcY{^sW$S^bwW``%DjII0>Q-?y4YQNTC*FLowV!aHmbX~DscLkVJ$lf;nqF}y8+)ab z<%rExUdVuR}ay9k;v#d^}XTDHe%Uai|0NPB-$XRM^_pA@MJmS@vrYP))#auZOxNWCbUG<+1M zUR!_K{0LOfhDBY3Kx9dLZ)28ug2>X!qTG-e@~p)l^|U z=LR|P@kXAh@zhiqt@rF8%UMQQR|JvBm1lXW##4B)jn`>Hgp0GdQ|AsM@=injs3 z_p)ib9!|I0Qky4H$@DCpOVYhG?pfV=4v zA%{X1VnNS*$my+#Fd7WHv>d(Bpq-Mc&oE`_6trxcZJIpPm}kf^rlyaZnx#ukmq=;Z zm$^__Ulz!MSS%a%PGD~~lGZ{fMFl|-PL`LNtxeY%^t$v9uEA?QzxVBvhYhs&o9@6>D#lcUenrE86*oDW0_VNM+aL{Rl!=1N%@i=k@6-jT_l zDvzO+(dKn%d0ePnp?!qWl##AA7<05)x@==cu1@=Tmhp=jA4uiJdUX^XWY)VQX@@u+ zzs$|}nq`9)9`J=1z5BcwhC`G-L)W2R{LGS4l8>odAM#fa zi5E;Z2;gzPUHr`&(&cdG|E7ZO!wqT1tSoYy)}YJDGiFWG>J2%%tSPB!Z!6&iC&r|| wC!;eGFb3wanLQmyjeblo^S5yNeA}vZLRN;kQ@tTKHADX%gOw-ABqsU)0S9tdiU0rr diff --git a/src/lang/qbittorrent_ru.ts b/src/lang/qbittorrent_ru.ts index 9155d9db3..f19b02a49 100644 --- a/src/lang/qbittorrent_ru.ts +++ b/src/lang/qbittorrent_ru.ts @@ -3216,6 +3216,10 @@ Changelog: Download in sequential order (slower but good for previewing) Загружать последовательно (медленнее но удобнее для предпросмотра) + + Skip file checking and start seeding immediately + + authentication @@ -3632,6 +3636,101 @@ Changelog: Пожалуста введите минимум один URL. + + downloadThread + + I/O Error + Ошибка ввода/вывода + + + The remote host name was not found (invalid hostname) + + + + The operation was canceled + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + The connection to the remote server timed out + + + + SSL/TLS handshake failed + + + + The remote server refused the connection + + + + The connection to the proxy server was refused + + + + The proxy server closed the connection prematurely + + + + The proxy host name was not found + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + The access to the remote content was denied (401) + + + + The operation requested on the remote content is not permitted + + + + The remote content was not found at the server (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + The Network Access API cannot honor the request because the protocol is not known + + + + The requested operation is invalid for this protocol + + + + An unknown network-related error was detected + + + + An unknown proxy-related error was detected + + + + An unknown error related to the remote content was detected + + + + A breakdown in protocol was detected + + + + Unknown error + Неизвестная ошибка + + downloading @@ -4730,19 +4829,19 @@ However, those plugins were disabled. subDownloadThread Host is unreachable - Хост недоступен + Хост недоступен File was not found (404) - Файл не был найден (404) + Файл не был найден (404) Connection was denied - Подключение было отклонено + Подключение было отклонено Url is invalid - URL некорректен + URL некорректен Connection forbidden (403) @@ -4758,27 +4857,27 @@ However, those plugins were disabled. Connection failure - Соединение не установлено + Соединение не установлено Connection was timed out - Тайм-аут соединения + Тайм-аут соединения Incorrect network interface - Неправильный интерфейс сети + Неправильный интерфейс сети Unknown error - Неизвестная ошибка + Неизвестная ошибка Could not resolve proxy - Не удалось соединиться с Прокси + Не удалось соединиться с Прокси I/O Error - Ошибка ввода/вывода + Ошибка ввода/вывода diff --git a/src/lang/qbittorrent_sk.qm b/src/lang/qbittorrent_sk.qm index dd9cda5224aa5176b41fadfcab4fb2b8ed5dfccf..0bfb9e5124590f7fecd9a220936b405eb9ae92d7 100644 GIT binary patch delta 1995 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 Download in sequential order (slower but good for previewing) Sťahovať v postupnom poradí (pomalšie, ale lepšie pre náhľady) + + Skip file checking and start seeding immediately + + authentication @@ -3562,6 +3566,101 @@ Záznam zmien: Prosím, napíšte aspoň jedno URL. + + downloadThread + + I/O Error + V/V Chyba + + + The remote host name was not found (invalid hostname) + + + + The operation was canceled + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + The connection to the remote server timed out + + + + SSL/TLS handshake failed + + + + The remote server refused the connection + + + + The connection to the proxy server was refused + + + + The proxy server closed the connection prematurely + + + + The proxy host name was not found + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + The access to the remote content was denied (401) + + + + The operation requested on the remote content is not permitted + + + + The remote content was not found at the server (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + The Network Access API cannot honor the request because the protocol is not known + + + + The requested operation is invalid for this protocol + + + + An unknown network-related error was detected + + + + An unknown proxy-related error was detected + + + + An unknown error related to the remote content was detected + + + + A breakdown in protocol was detected + + + + Unknown error + Neznáma chyba + + downloading @@ -4699,19 +4798,19 @@ Tieto moduly však boli vypnuté. subDownloadThread Host is unreachable - Hostiteľ je nedostupný + Hostiteľ je nedostupný File was not found (404) - Súbor nebol nájdený (404) + Súbor nebol nájdený (404) Connection was denied - Spojenie bolo odmietnuté + Spojenie bolo odmietnuté Url is invalid - URL je neplatné + URL je neplatné Connection forbidden (403) @@ -4727,27 +4826,27 @@ Tieto moduly však boli vypnuté. Connection failure - Chyba spojenia + Chyba spojenia Connection was timed out - Časový limit spojenia vypršal + Časový limit spojenia vypršal Incorrect network interface - Nesprávne sieťové rozhranie + Nesprávne sieťové rozhranie Unknown error - Neznáma chyba + Neznáma chyba Could not resolve proxy - Nebolo možné preložiť adresu proxy + Nebolo možné preložiť adresu proxy I/O Error - V/V Chyba + V/V Chyba diff --git a/src/lang/qbittorrent_sv.qm b/src/lang/qbittorrent_sv.qm index fe830dd0fbf03028c2d096acc316d11ebee4c15a..4aabb973a63088aea41f7d76296da9973c2523e5 100644 GIT binary patch delta 1989 zcmXBVc~n%_9S895d-EQTH^YF8;uNBcddjK{iWOoMNAaLw1hr+4BZmr!CI(Jo5fcO# zP_h6CUNi=S%?3fCG=P9&Nkst_!MG6`VpNc!3l+; z)OFgy6WH*~<-i}F`9~l=5Ad(zCQk#Bo_(JWY%By?z6O%d1DDp9^q7Rcl5w-xH;c^_ zJUvcMgB-C4I6c9=`V!Y}XR(6M3LE6lWZ>Fd?wwz_W5e7>7a&*u3|x$XTtjhN&cUIX zGWxy=>aNW|yTV$9#l{zUT7b|pgbz}T7xS?ye*(C1hPjEWJWg2o>)cmT^3~_{dX6opUxI(qO~^_wEA`cJz19c(Kmq?Y~s>dGq7s2XbGbJol6rfo&LaMjTrHG956i)lhSFk#ns&CDPoq6I`iF5 z?t>a}Uy6nLt``fcih!q)O@8D-rRmme+)hEwy{g$b(hOWFXL^U#>J!a}hSNY_B(pjg zg#ni7U=fB{qeI|=ZYeRGlKOj&l(bWgJV91SpVuq{zA>`b6(6-xs+m^-*gaUeVsx#R zI=7w!PA=z;y0Q)>Sp4=a_CLieHu(A2amo?maJJ-I3jXMTw8{U+!?W(45%UFOKY-o;f@Q9|fFi_3Czk+3|Cbi6AWm`XR zy_1!zabi~(`xi}93Cq!X&uMj43{SGDI^T0gx|Hd$Yk+%86%QNL;aW25&<1Wbr zd8GrdyVObbqc>bC$jhxHPE+ODOHK5Vdxoi_){GXKLsY zV(;r0xc93QQZKOO9q!3a?&t@sSMP0j7^|HgGz84|*ZN+die1>p^v=QJ%>)+iyeVvW zxwdv04Vv#t?m=Je*B4FzKRnVl?Vwe|S=#2NW59!PZSN2zWk zmBD7Zc>7<<*3Fnft85!|zOzRG_cYz2=Ys$byKeQ|qjWkK>ef_j1#We**Im5D_H=g0 zCChb8*O~Abc(hK}ZQVkTvap#`%wpYU7B$7kZ_w%Yam7GEHn${#d%2Q3)a#V=8a=VO zl9f++Sv)<1$*$4b9!amrGzEh(%vKxC(<|nz zK2QA;IBwQ|GI#}uIHIq1`V&>)Q+>m5B4GYO-+pl^;2NyIk?uzG8LICy zA-f@PC+hS+AE5Qawam+qtF_6_d+*XXk2kWv7|e#2=bRg=sew9w=QB&F-ly}~xWOzw zE?_gKT7-9*b!xolzg6G^Sx;(rUM)z)y%TKGU^n#gB6`NeqaDA#@9lMwAFFL1w oRId@1yEvz2WTkJ*NJ)*^@@85}Dm(Vnx52X`ZAo*oBp4n35A=wLf&c&j delta 2817 zcmaKu2~-nz9>>3#Ob8R0V6cj!NVIaQQBm=hss-_)c2_`AaDxdDiHYU_T@O@5tWT}@ z$78*otw*(ZtfC;bDBj14>jBoSCrT7N@YYs~?hofZci*n<%lpq~GH>Sp`~AMZW9H{Y z{L6fP$tTVC0T=+Bo&zX)1K0W!zW@%Ep^$SY;bv=sbyIM2U~O%D$fY7FZW1Te|WnCF7992Q63!-d|A4iiVQ( z_dQuGuk)^`m)#2a8<5>wR{PyZplTjl#{27oxPX`npqGp5vqJ|&jpri5T2U3axQOGS zz>9HQ^wWoc|06EJLYwt0kQmd5%LtAI9&G0_Jt$+9zes%M&dt$BP(6rT?v_Qsskcm2 z=(zo7SzpDt(Qo_W9MP~=tv6pKs}%EC6(*?&b)p4GoYf7&r%)$%2x2RH(Vtd`t!N5 z+kneES-qPswEPjjrkDqI1xUPG&VRdQ0T35Y{GPap|8`qHpmYU`RR(qL#&2uC38-1c zA5f`*X6yJeeGK(ZGJkYx0I;tef82B!C@hm$o5!{*!@0A+GM7^4yZ1Xq9Ha6u&yx7{ zL5WwJvkva9LJzN3OkTPb2-={SYCTQ0H%*b1mjv9*Rbmo_c-C)~Q;l9@|E1gZLAXuEz8J0?2n5xX!Li*j#WA&;a!KloaQwV4LSO*WE!7Y>< zUYUU8d&-@yXshYxm4D|Lu-Bw4Or*eFc4g@-N@>q`%IiM2fze9k?KgYr>0)Jd0(H9Q zG-XZZ=hXQ!mgC{yda!%@XI7e5+3o`ZEI^FjeZbaXz~T&vmBs9s#~@h(6FnmY-hKZZ z>X^q}*l*p*{~+p<%@o~076)k}OHBxt(y1nR~JzUj{?_U%H*!U+_Nnr-szm^DHe ze9Q-EBNs+~Pu1A!Ct-9|K2We+NHnWx{O%Q!zPbqXm?v@18HwlY60e6#e4Z{$mfZw8 z-WQy;ku=o&gef^YXc&JX%;-b2$g4=0^^RnESSRH6CRtW>7j{&gCW(iNJ)0*8b$lg| zHeceND2eyH*jh2r``Ip4)39owQ>ZHV1SxrfW0hh!ckwb4)k&PIj7?PggiKZyWzapY zSE}Nob-=U1s>*6|Kfqg6y*L^;zggmwO>Db5oGX6BTJZk=E08-<#}d6VHR&G5M?D3e7kHdWOaq>-W-c!s z_o$9FX%r+&W_=s^XaYU|6t|f6jrB}Or~QiqnXyp{w{HzAZxl1+%v@2apv+fQh-x{- zvm#v7tXTjo`9*9QPnD5VA+{ZJoyNy{F<>zb`@iH%+_q5+uY3z^t`Va1FwuYs(j!iH+v*WO@( zjTqz~D_MGp47y^Y>keY-e_3nxKh_+kiAICg>U4b6pk%KT8@}5osUap8Md8FG`e|v| zV8s+n{Sb-IK&#Vi&|0hxt<7k+nlp^rNjB@0seiC_FGNu&W*Aw&OD(d}=-fd+Jvpu= zDZ8Q*t&k4}nnjt+#`hvM*hsNDEe36H*G^qS{=h;o;z%Ofd(j(`&~UDOpOyw`8j|8d zGFh~_gTCtCXQXko)$Y)m>{_RV@;W|EpKSiWlrzn^Zhd~I26|9XMhZ$#*>;erR5~^o zswPT#Nr#>F>*5#CVz6br)n=pYYb{1crq!0NHCY@+TZ(@Ce=M@QM?Y)(JEqzomf|s^ j7a6p$s{KuMAH-6}+RP0>m@FB3v+3gnW!QT_*3#|Y4m@e@ diff --git a/src/lang/qbittorrent_sv.ts b/src/lang/qbittorrent_sv.ts index 1c8821c4a..98a57a400 100644 --- a/src/lang/qbittorrent_sv.ts +++ b/src/lang/qbittorrent_sv.ts @@ -1870,6 +1870,10 @@ p, li { white-space: pre-wrap; } Download in sequential order (slower but good for previewing) Hämta i sekventiell ordning (långsammare men bra för förhandsvisning) + + Skip file checking and start seeding immediately + + authentication @@ -2210,6 +2214,101 @@ p, li { white-space: pre-wrap; } Ange åtminstone en url. + + downloadThread + + I/O Error + In/Ut-fel + + + The remote host name was not found (invalid hostname) + + + + The operation was canceled + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + The connection to the remote server timed out + + + + SSL/TLS handshake failed + + + + The remote server refused the connection + + + + The connection to the proxy server was refused + + + + The proxy server closed the connection prematurely + + + + The proxy host name was not found + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + The access to the remote content was denied (401) + + + + The operation requested on the remote content is not permitted + + + + The remote content was not found at the server (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + The Network Access API cannot honor the request because the protocol is not known + + + + The requested operation is invalid for this protocol + + + + An unknown network-related error was detected + + + + An unknown proxy-related error was detected + + + + An unknown error related to the remote content was detected + + + + A breakdown in protocol was detected + + + + Unknown error + Okänt fel + + downloading @@ -2952,43 +3051,43 @@ Dock har dessa insticksmoduler blivit inaktiverade. subDownloadThread Host is unreachable - Värden är inte nåbar + Värden är inte nåbar File was not found (404) - Filen kunde inte hittas (404) + Filen kunde inte hittas (404) Connection was denied - Anslutningen nekades + Anslutningen nekades Url is invalid - Url:en är ogiltig + Url:en är ogiltig Connection failure - Anslutningsfel + Anslutningsfel Connection was timed out - Tidsgränsen för anslutningen överstegs + Tidsgränsen för anslutningen överstegs Incorrect network interface - Felaktigt nätverksgränssnitt + Felaktigt nätverksgränssnitt Unknown error - Okänt fel + Okänt fel Could not resolve proxy - Kunde inte slå upp proxy + Kunde inte slå upp proxy I/O Error - In/Ut-fel + In/Ut-fel diff --git a/src/lang/qbittorrent_tr.qm b/src/lang/qbittorrent_tr.qm index 78537a0d1bcc704d3aab006e6804426c10effd9b..6c90048013d3cc3e0eec14a7b66863112f2fd143 100644 GIT binary patch delta 1816 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 z?ff?Mk8Download in sequential order (slower but good for previewing) Doğru düzende indir (yavaş ama önizleme için iyi) + + Skip file checking and start seeding immediately + + authentication @@ -3609,6 +3613,101 @@ Changelog: Lütfen en az bir adres girin. + + downloadThread + + I/O Error + + + + The remote host name was not found (invalid hostname) + + + + The operation was canceled + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + The connection to the remote server timed out + + + + SSL/TLS handshake failed + + + + The remote server refused the connection + + + + The connection to the proxy server was refused + + + + The proxy server closed the connection prematurely + + + + The proxy host name was not found + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + The access to the remote content was denied (401) + + + + The operation requested on the remote content is not permitted + + + + The remote content was not found at the server (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + The Network Access API cannot honor the request because the protocol is not known + + + + The requested operation is invalid for this protocol + + + + An unknown network-related error was detected + + + + An unknown proxy-related error was detected + + + + An unknown error related to the remote content was detected + + + + A breakdown in protocol was detected + + + + Unknown error + Bilinmeyen hata + + downloading @@ -4683,19 +4782,19 @@ Bununla birlikte, o eklentiler devre dışı. subDownloadThread Host is unreachable - Sunucuya erişilemiyor + Sunucuya erişilemiyor File was not found (404) - Dosya bulunamadı (404) + Dosya bulunamadı (404) Connection was denied - Bağlantı reddedildi + Bağlantı reddedildi Url is invalid - Adres geçersiz + Adres geçersiz Connection forbidden (403) @@ -4711,27 +4810,27 @@ Bununla birlikte, o eklentiler devre dışı. Connection failure - Bağlantı hatası + Bağlantı hatası Connection was timed out - Bağlantı zaman aşımına uğradı + Bağlantı zaman aşımına uğradı Incorrect network interface - Geçersiz ağ arayüzü + Geçersiz ağ arayüzü Unknown error - Bilinmeyen hata + Bilinmeyen hata Could not resolve proxy - Vekil çözümlenemedi + Vekil çözümlenemedi I/O Error - Girdi/Çıktı Hatası + Girdi/Çıktı Hatası diff --git a/src/lang/qbittorrent_uk.qm b/src/lang/qbittorrent_uk.qm index 983305b60fe3ace07e65ee5fb95231f7724ef9a3..6d0b825534a4a48de48683ed0ec3a4c2c2cf541a 100644 GIT binary patch delta 1560 zcmXBUc}x^n90&04%+Bnv$AC~}VGC?P+(oT`P(cNutwC5@peiD4SrSqZu!sjN6w4(@ z5yQ1SKn}r*TDd%_7!N#BL~TK%4c4eJ)uI7oZE6EnsIrmILlBfL8&%-eX;4U@EL;jq^1i@)l6w0IYiFhrpV5##*a1 zim!o$N?_w->tPLZ!+P1kytV$JbAACnViCRUBU!>pHrtXpjA3CB_@27!nZBXQY3FLH=0%nOO>~;sR@Cd>lmC}17Sh3?dP{xo^CXlHkA{(Vmb3<%p z1JE3Rb?MsxXEoL}zM{S)1+32gC`_I8KubDIuk-20^^n7?x3eYC zb@Va;wcTu}pBrFtVMB-J0qw)ADU+@;`v*zAmd#bsMwJ^S_ZZodq)-|`3R~V;MPn!= z12PRm$fzvTK2?^GMc2?iktK|u0*XH)b2uNx1zD}bX<(->F>`^;J<`A#=KjpZhj{~A zvpLhMN1#pMiiGn(wwl|%|338qSH89v*rg|rId5&T3)j)P3s_J_?WW%3I(kEZEn2dG z*K1Qlx!w;B0!@|Nd8I9&ddUsu%>go4vXKv9x7(6~yn#7NMtIGVLO#Ve4DcV~GtbZs zEI0WrbzOiH!{=@KiGKQQzQ~#gSjYL&;uPTh0lv(M29&j$xXSf@>GS#4olQWapJek% zzE@U3k6H_V;v!vU=_Scji)7PzVv+0S{wCK((ctQ~O13o0=bxpU%^H>mK4}L$yX4C+ z-34~cAOrFMHa~()%0m~vkpGoMW1VqVKAl`krcsDlq6Uj3+Wsb3l_gr;2TdNr;~Q7zEG&Vv71IxE7Z$qJ%ww8hL8!`Dt}>L z-BX}JF6@7q4lFJfj=IrRmyZa?SOTP{2z_SSkH%zSpqK{cX)FBx?@9Xpbz#hO24Fgb zH=QGZ!^bwRPSpUL7eHp&1hDl+5@};#u9E^Ay+@T^A#b<_q@9(l*(}*ste9K5ftK)! zjMx~AcNE6U8sNQiiui|g3X*~q<_slJrwqbK0gE*8{h(erUjEL9u;5-*B9>TFtAg*bRM7?2yp zUv-5*jH7tRfgboBk&>-(;`F!If!*$8Kpo9w6H)ZBPq6LlNu+=4AltJ+v{@NfNTjG| z_r?(mrNoc4iQ$gV?8d9R=s>@*n_6K8eD~7Izf<;2i+`^tu06qaw#l1vGcz_NCC8*~ ZO-V{7rs#QO%3|L)+mh$sH`wFE{}06?-9rEX delta 2319 zcmaKseNa@_8OEQzd+uI#mn8#{PsLp*uuCFH1SA{21mr^-wWcg0ikTG_SY38IunYAA z7C|&7fZzcGDxfqNG#cBGnu%Z0)Q>cSwrQ*FM3Wk79BixYv}3JSJAL7HoKD;D$JyWR zxo6JvKF|B!9lI{v_)6%U5pfehHn901Af^Hx6@ZijMC<`f4Ya?iE7_@Hg$$;axGPk@hv-b>- zRv2HH3-N#mG`nSX9+TO3SLT6r5Dz{AHZFmBa~V)q%o`MDy*Xqnu-A^b?;>}+ zh0Zh}Z|gl^>yP+lMT#Pui^9^#$}1>p>j8RiV}*Sq5bBE+yB`uCpg6x3*f+qd1-<{P zC>iMn_JpG3@n-U{iuVigVOt;KwCMuS_zC`anAG#{x(UVGJL`d^ zA1aQ2dj^nkU#9(%%)Txjr__5B6?fh)1a@r@d=ndiS)U6*rV^mDM97>s8*q;anHQe} z4!k9lIO&#ey)QE+OsF$isHOp-UP}RPdnj`-LTI*TQfq9&_K|jKLcH+igY!V#Oqtnl z2qy~s09TH1wVWEpf1)(|2P;?Cl1A8V0@yX6S5;~Kxr;={aSY-r?l5^p6QCVs|- zj${De`;-TYF<}*dVn^l-Q~GJ_jD~8`K49lJL<8&J;}&tg&~%2ki^kYj#Uf6jXGO|f z8YiEu^Fh8uGMfD*Pf#Ph9!-*G zUL_6XucW#W3Zy$;YWvxnK+^)LTS;X%Dy5!`JCsPGbYR!->G^SfR0=i+N~5J~fZa2s z(@oTcC_m|U|M)STZj^47oB$L<(nS428ht@}GIALR$npsf=>Wceo8On_3;ZFE^D(L$ zeNHyh!1dQ~i%-mRZP(PQo}U6$>t*gV$lPD7_D?j^UDwsIZR^O#A>Qv}T=bfH(S=~( z*;DG3Uv&f4GW|d- z*i|6yvCJy9%)W4LQO86M{#;|aL_Rn4X^O9lK!sAXdhko2WRa%wpP@i&0q<9*n5~+3 zGadmUcA4KP)co+$VW4fB=6KyLN~>4%!SMlLuu5~Qqky_)mDzuh>oj^r9goxKBht0A zX3^Q6wOUgI!h(a&uleui8%fZ5nlR>lY{3mIE z%BcIbz7Z%4()}iYhP>s8%z*^mqit6xfX{fV?=nRczv?^J-`8*Soi+52p6Yipl|pmW z^FUpUFqFX430uawO_v|E@0p1XdMRE%`pn<*N`ZtyN?>Sw^kdy$D@H}nu|)427Ql*F z5=&zlY#vKx$t;~^z`$~7rNGDv=~+5Upq0*wd`Jx{S^+sOr_)yEw!55$3aj1Wsj*44 z?O*FzyU&6+tX-xrx6MK50QFnt)blJwA;$3(McjNFS2~{uz+Pw z)ja7WpT1=g$;JPA;#Weo-jM$ia@(tIJ&o2J7De}(S?biy$&)uvUF(>xFAG>W)tc$0xDu%OFH-womTx4bw5b@A*?i*UGc)ZK z(bMdy{e|>tW?4^_XD)J=VRWVr kkk9{9AuMDownload in sequential order (slower but good for previewing) + + Skip file checking and start seeding immediately + + authentication @@ -3571,6 +3575,101 @@ Changelog: Буд-ласка, введіть хоча б один URL. + + downloadThread + + I/O Error + + + + The remote host name was not found (invalid hostname) + + + + The operation was canceled + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + The connection to the remote server timed out + + + + SSL/TLS handshake failed + + + + The remote server refused the connection + + + + The connection to the proxy server was refused + + + + The proxy server closed the connection prematurely + + + + The proxy host name was not found + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + The access to the remote content was denied (401) + + + + The operation requested on the remote content is not permitted + + + + The remote content was not found at the server (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + The Network Access API cannot honor the request because the protocol is not known + + + + The requested operation is invalid for this protocol + + + + An unknown network-related error was detected + + + + An unknown proxy-related error was detected + + + + An unknown error related to the remote content was detected + + + + A breakdown in protocol was detected + + + + Unknown error + Невідома помилка + + downloading @@ -4647,19 +4746,19 @@ However, those plugins were disabled. subDownloadThread Host is unreachable - Хост недоступний + Хост недоступний File was not found (404) - Файл не знайдено (404) + Файл не знайдено (404) Connection was denied - Відмовлено у з'єднанні + Відмовлено у з'єднанні Url is invalid - Неправильний URL + Неправильний URL Connection forbidden (403) @@ -4675,27 +4774,19 @@ However, those plugins were disabled. Connection failure - Відмовлено у з'єднанні + Відмовлено у з'єднанні Connection was timed out - Вичерпано час на з'єднання + Вичерпано час на з'єднання Incorrect network interface - Неправильний мережевий інтерфейс + Неправильний мережевий інтерфейс Unknown error - Невідома помилка - - - Could not resolve proxy - - - - I/O Error - + Невідома помилка diff --git a/src/lang/qbittorrent_zh.qm b/src/lang/qbittorrent_zh.qm index 0e44d2cf0af0c6b9719ad8e9f879fe8e250fcfa3..925f3dd3f053cb8a6df12cef87a5cf2a4dd68460 100644 GIT binary patch delta 1970 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 K(B-plNd5(luq<`} diff --git a/src/lang/qbittorrent_zh.ts b/src/lang/qbittorrent_zh.ts index 561e00c7f..00e74001c 100644 --- a/src/lang/qbittorrent_zh.ts +++ b/src/lang/qbittorrent_zh.ts @@ -3379,6 +3379,10 @@ previewing) Download in sequential order (slower but good for previewing) 按顺序下载(速度有所减慢但利于预览) + + Skip file checking and start seeding immediately + + authentication @@ -3804,6 +3808,101 @@ enabled) 请至少输入一个URL. + + downloadThread + + I/O Error + 输入/输出错误 + + + The remote host name was not found (invalid hostname) + + + + The operation was canceled + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + The connection to the remote server timed out + + + + SSL/TLS handshake failed + + + + The remote server refused the connection + + + + The connection to the proxy server was refused + + + + The proxy server closed the connection prematurely + + + + The proxy host name was not found + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + The access to the remote content was denied (401) + + + + The operation requested on the remote content is not permitted + + + + The remote content was not found at the server (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + The Network Access API cannot honor the request because the protocol is not known + + + + The requested operation is invalid for this protocol + + + + An unknown network-related error was detected + + + + An unknown proxy-related error was detected + + + + An unknown error related to the remote content was detected + + + + A breakdown in protocol was detected + + + + Unknown error + 未知错误 + + downloading @@ -4973,19 +5072,19 @@ network. subDownloadThread Host is unreachable - 无法连接到主机 + 无法连接到主机 File was not found (404) - 文件未找到(404) + 文件未找到(404) Connection was denied - 连接被拒绝 + 连接被拒绝 Url is invalid - 网址无效 + 网址无效 Connection forbidden (403) @@ -5001,27 +5100,27 @@ network. Connection failure - 连接失败 + 连接失败 Connection was timed out - 连接超时 + 连接超时 Incorrect network interface - 不正确的网络关联 + 不正确的网络关联 Unknown error - 未知错误 + 未知错误 Could not resolve proxy - 无法联系到代理服务器 + 无法联系到代理服务器 I/O Error - 输入/输出错误 + 输入/输出错误 diff --git a/src/lang/qbittorrent_zh_TW.qm b/src/lang/qbittorrent_zh_TW.qm index 0ef8e0d802cbef95c59ca4478b328f6c991ac835..14e2160dde88465197035f08917bba628438a84d 100644 GIT binary patch delta 2042 zcmXZddsGzH9S895&d%&OyDZ2mAVk<;1Ox>l6fhFmqX@nNf)79rV5k^WRI~(C1bk4k z@>IAyL>>yt`wapodWi7>+MH5PW3iQD5(u`{|CGP=y zjX==XG{OrYl)SVM*#1^;AUqRTVk5hu4~TsGe*_Sf2Na9~yYB)Q*B1`!6>WvH?uuq+ ztI%6dLfGg<_czN{4a;_X%XTUp*X3D2s1bnbSlPz2vRzTKy;TtE=YXy z=Lo5nfbLB!nG3VY*^aQh5}-2>;rmko`}YxE`fu_so8|0Wa@B~)`I&B4AhNL-2$`16 zTO-?b8j=4^qx_ngmoiv=We*0H4FVNUSiaK9ej4MqKLR{<3k^pM|+w ztAW};Hlp-d`DevPBTIk}re)VZl{Mxn&S$&9p-za`Q`3Nu@sxuk+m5 zSOYZh^XH6>`P4Yun1kTPT?k=2g_y|8K}zpLnpXEfxhBdVSREzXKCCnhZvukjWwV=< z0nv0F^b6T@waSQ$EFkucGNQ}|sMIN=k|?Yt)5@sne!A{qTGa;o6y*io=M>CCW$D{y zJ^5T&IdhiQdrVmsLo3#8&5~7qT!W7Fs@zu&@w);j(;{C!GIRn+J76TuqeV@C{*iDZ@hj@jS>aS+3>Df_$UME5dTW=EwTSw*=poCW z=k1c~B~+Zd2(z+yR6c*Hrk2f884@Y`=3lD(Z;t|(PqQj1j4Pkd{vjC^ z11w$bWPeN4y*vq=bCT^)iIzJz(<>9A%@i$FbuJrJd)qWF7LzSAfTN4VWRG|{M+7mY zkw$JYG7F8<+V90;B_&tkDVF%n01L;&%QOE0%nQVtqG$Bflz8>kemcQM#SS|f{9}8u zlVd>cZm}mi257Tl=^88PsyG>W12ECBI*ne@&j#sticM((xt0*-YGP2#v1Ai>=bt21 z$#1Agow5z-ve%zVHVH2&lO)MG?*L7@h>e)IpQ@HN4O#*3{7u@?Og(2^CG8q71~OMj z(FfH)!xkwfo0e{Qifqm|velll4b8H>7Sd70ceFuINXat+v=PUp<5}%=Aa_XVAEpAP zk0qlorIHdVwU2)VXug$hw$ic2a<%Wt}Q~{?l%X#8!mgqQQdjJ8K~=3_odKFZANu}Uo~*updOi| zgzT26Ckr-Gt#z_J_H4@3o69#aTQf(Oi-$Ce7t>p<>6&Hs&j3rM#%q-a`AV~4c?E6U zU7F2xRH^!p*&#DWuH*nKF*{~Hq8W;KL5I#3&2OXk0X?^v?R+=Rc$WpucXBQ@*%np+ z>=R@YkH}t1m2K6VL?+OTd9AE!e!Suy6U?_tDOypWN;kjDqRs8NDm6mAT%z zQG2j-Dd1nBO)pNOM(fsQO4oohpJ^*6eh2t8YFkV`rSwzTthtr__u4<|Gk~N!+CS-N zJ6&#*?TOdUeMV2W^)UxshPri=>6!1SKf4E5o6g-l$+V}1N~In(z3EFUoBxK*>fE?K zA7;D2pm@ci7lhm0Hk&SJqVL!hv%in61HAps{uvleA17~Go4$dbuNRy*vYv>goM{{z jy}!!LG%oSj;e&~>aXa??YHw^@PgF&yOV6PP$N2vN#=w6= delta 2633 zcmaKtc~n&A8OEQvGsAFaxWi%q#f8DBEGml&qC}_yf(xj~CJGi|z>#rARz(He2#Bb_ zhk^p`$PNMmF2^*+V49@1rz$ZqXkAmZQIpg*(NyhA?m48VNAt(b@64ThpZhM)`+i@P zN$>BM7QZv>G=SN_{scho4V>6WTnI2$GSOCIT@v6Jw;l*Q4kRA|=4}C7{wT8GFT{@l zZ9Wiug%maeiwAfVSTaERFLE0&+D>F(7Z5#g{TpC;5wLp|u;L<6ex>BHy~MlZv75w; zjg;6AONBgWDzNKIk=4sYwyt5}l5w+l9)tXd9H@ROvd%)}$wwl){{i`l7bH6d@+Jz~ z!v`kal+dwj;5WqsWgYCiWV-$Iq1%D><(P5#Ea0{l0e30X@-WQV{scJG%>-_aUC}WF zZ=(p~ld0aUPC6sHt_)bzFLLMSBHPr6{?8_=hZh?w4N)HY9_O8UfXXD6Ep>Fr#GMNZ zfJrOx=TaM7CwHi86aWNzyg{9SW?Sh09!X4?mXNb>0so+>t!24Fl@+lGhur0_J_3X^J%v z>&ux<&H=`L#o0JT1GP7~u_4!hiA%WmT3mstFFD^yqsTeuINwVy!0C}(&<~FRyJRlf zK(CpwM5On(T&7bv&~}|$r=mU|IsOZWpevNy8s`i6_;LAlyMT(@Opv>Bdv39r@>uTR z*Q{D@J8PNL_wrmIBuV6sY0`ig`W-w)WP!UhDu-$x_evU7Zbwx-EM1;P!Hn*gF7NLK zs%Ei&$pal^(qgMKz|k1#z5&Z_d?KxSxRt8hC#{a9Ix#;^q-1TN*(5 zm3%6TUVInWut%1*>7T&iHd(IX1EBP(Y|F7e%6q0PKfH;Imc?G0xH%7(RdvgN{GB3O zrpk`i6#}y+6B~$0vZGBtK=I#LxWdsRS=Kb6259M%eV|kW)|s*o<3a$hpJX3rjRlIH z%P#3Y0(Kk_*;>My6`owxW%fYfHq2Qb!N@?N{vr({Mb`ANiKh0>F7lMpdcgjwJj?hQ zx%06+w7Q>HH)_-T>ci{%jm73-85nRPV zc9YMS%x7AqqeHO5>KW~v{7#WAWeS_{c|gNjh1~$pKP^Dl#S| z(WEj(W*wEU(VD$fI`S!sGAZS7-~yYdvYnfzIQFBCmeUPI>nM`?y@TQ;$AH4eijEk{ zys1WUels<6!cN64+k1fD3dOyjJIN~^iu=)L0W+1Nf1N*V2V0h>vX=y~8v0ISJ*qie z!!0J5`SJy(=eE*>oLa(y&D=b;@FsgdC3zo_wJMR_<9W-;(@Exg-Y)qWP$1!*i&j%+ zCs>V{TkZsYZjUW6{3##SK$aU;%`d%E25g(a$LN)`hri-uchK~W&lFjx7g>ElWUZIT z?sz^$a+{_yi_dr%KRIscn1dL9?h)C*wVxKT(*)7@-6)eEgUNVhoE$ux#1^vD;gBnBsPa|EoMw_59W~9GSMpUs%anSef zxR+EMaxdLv;fy39V%4CYt)DSNpP(@q(>1BuG^0LKt67_BT%Viu8+tY?b3%kr_tj;q zf}nvDrof#(&V!mm=jilW%|M0&vWdnFLxRR>iu)Aj-_TSK#5hp1Q1=k;)hi|siVX=e zrlo6iX_^cJ6*qoW+)Djh>dp*N&S7t9hnl$+9?#sK-M;H-$miuN2i1qqHN+cJQ>m>Q zgEoDgF*RAEGo))%6XW84eG3b$^on?kum!>qiUrUlx}`X1gEF@dN~^Download in sequential order (slower but good for previewing) 按照順序下載 (較慢但較好預覽) + + Skip file checking and start seeding immediately + + authentication @@ -2305,6 +2309,101 @@ p, li { white-space: pre-wrap; } 請輸入至少一個 URL。 + + downloadThread + + I/O Error + I/O 錯誤 + + + The remote host name was not found (invalid hostname) + + + + The operation was canceled + + + + The remote server closed the connection prematurely, before the entire reply was received and processed + + + + The connection to the remote server timed out + + + + SSL/TLS handshake failed + + + + The remote server refused the connection + + + + The connection to the proxy server was refused + + + + The proxy server closed the connection prematurely + + + + The proxy host name was not found + + + + The connection to the proxy timed out or the proxy did not reply in time to the request sent + + + + The proxy requires authentication in order to honour the request but did not accept any credentials offered + + + + The access to the remote content was denied (401) + + + + The operation requested on the remote content is not permitted + + + + The remote content was not found at the server (404) + + + + The remote server requires authentication to serve the content but the credentials provided were not accepted + + + + The Network Access API cannot honor the request because the protocol is not known + + + + The requested operation is invalid for this protocol + + + + An unknown network-related error was detected + + + + An unknown proxy-related error was detected + + + + An unknown error related to the remote content was detected + + + + A breakdown in protocol was detected + + + + Unknown error + 未知的錯誤 + + downloading @@ -3067,43 +3166,43 @@ However, those plugins were disabled. subDownloadThread Host is unreachable - 無法連線到主機 + 無法連線到主機 File was not found (404) - 找不到檔案 (404) + 找不到檔案 (404) Connection was denied - 連線被拒絕 + 連線被拒絕 Url is invalid - URL 是無效的 + URL 是無效的 Connection failure - 連線失敗 + 連線失敗 Connection was timed out - 連線逾時 + 連線逾時 Incorrect network interface - 錯誤的網路介面 + 錯誤的網路介面 Unknown error - 未知的錯誤 + 未知的錯誤 Could not resolve proxy - 無法解析代理伺服器 + 無法解析代理伺服器 I/O Error - I/O 錯誤 + I/O 錯誤 diff --git a/src/main.cpp b/src/main.cpp index 1a9eb34de..72e17db15 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,14 +34,9 @@ #include #include #include -#ifdef QT_4_4 #include #include #include -#else -#include -#include -#endif #include #include "qgnomelook.h" #include @@ -143,19 +138,9 @@ int main(int argc, char *argv[]){ std::cerr << "Couldn't set environment variable...\n"; } //Check if there is another instance running -#ifdef QT_4_4 QLocalSocket localSocket; QString uid = QString::number(getuid()); -#else - QTcpSocket localSocket; -#endif -#ifdef QT_4_4 localSocket.connectToServer("qBittorrent-"+uid, QIODevice::WriteOnly); -#else - int serverPort = settings.value(QString::fromUtf8("uniqueInstancePort"), -1).toInt(); - if(serverPort != -1) { - localSocket.connectToHost(QHostAddress::LocalHost, serverPort, QIODevice::WriteOnly); -#endif if (localSocket.waitForConnected(1000)){ std::cout << "Another qBittorrent instance is already running...\n"; // Send parameters @@ -174,19 +159,12 @@ int main(int argc, char *argv[]){ }else{ std::cerr << "Writing to the socket timed out\n"; } -#ifdef QT_4_4 localSocket.disconnectFromServer(); -#else - localSocket.disconnectFromHost(); -#endif std::cout << "disconnected\n"; } localSocket.close(); return 0; } -#ifndef QT_4_4 - } -#endif app = new QApplication(argc, argv); useStyle(app, settings.value("Preferences/General/Style", 0).toInt()); app->setStyleSheet("QStatusBar::item { border-width: 0; }"); diff --git a/src/qtorrenthandle.cpp b/src/qtorrenthandle.cpp index e51389244..bb3ccb7ab 100644 --- a/src/qtorrenthandle.cpp +++ b/src/qtorrenthandle.cpp @@ -163,11 +163,6 @@ QString QTorrentHandle::save_path() const { return misc::toQString(h.save_path().string()); } -fs::path QTorrentHandle::save_path_boost() const { - Q_ASSERT(h.is_valid()); - return h.save_path(); -} - bool QTorrentHandle::super_seeding() const { Q_ASSERT(h.is_valid()); return h.super_seeding(); @@ -239,9 +234,9 @@ size_type QTorrentHandle::filesize_at(unsigned int index) const { return h.get_torrent_info().file_at(index).size; } -std::vector const& QTorrentHandle::trackers() const { +std::vector QTorrentHandle::trackers() const { Q_ASSERT(h.is_valid()); - return h.get_torrent_info().trackers(); + return h.trackers(); } torrent_status::state_t QTorrentHandle::state() const { diff --git a/src/qtorrenthandle.h b/src/qtorrenthandle.h index fa10bf54e..090a165b2 100644 --- a/src/qtorrenthandle.h +++ b/src/qtorrenthandle.h @@ -81,7 +81,6 @@ class QTorrentHandle { int num_incomplete() const; void scrape_tracker() const; QString save_path() const; - fs::path save_path_boost() const; QStringList url_seeds() const; size_type actual_size() const; int download_limit() const; @@ -93,7 +92,7 @@ class QTorrentHandle { bool is_queued() const; QString file_at(unsigned int index) const; size_type filesize_at(unsigned int index) const; - std::vector const& trackers() const; + std::vector trackers() const; torrent_status::state_t state() const; QString creator() const; QString comment() const; diff --git a/src/rss.cpp b/src/rss.cpp index dd86e80ef..c13e0bf63 100644 --- a/src/rss.cpp +++ b/src/rss.cpp @@ -561,31 +561,37 @@ short RssStream::readDoc(const QDomDocument& doc) { image = property.text(); else if(property.tagName() == "item") { RssItem * item = new RssItem(this, property); - if(item->isValid() && !itemAlreadyExists(item->getTitle())) { - (*this)[item->getTitle()] = item; + if(item->isValid()) { + bool already_exists = itemAlreadyExists(item->getTitle()); + if(!already_exists) { + (*this)[item->getTitle()] = item; + } if(item->has_attachment()) { has_attachments = true; // Check if the item should be automatically downloaded - FeedFilter * matching_filter = FeedFilters::getFeedFilters(url).matches(item->getTitle()); - if(matching_filter != 0) { - // Download the torrent - BTSession->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(item->getTitle()).arg(getName())); - if(matching_filter->isValid()) { - QString save_path = matching_filter->getSavePath(); - if(save_path.isEmpty()) + if(!already_exists || !(*this)[item->getTitle()]->isRead()) { + FeedFilter * matching_filter = FeedFilters::getFeedFilters(url).matches(item->getTitle()); + if(matching_filter != 0) { + // Download the torrent + BTSession->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(item->getTitle()).arg(getName())); + if(matching_filter->isValid()) { + QString save_path = matching_filter->getSavePath(); + if(save_path.isEmpty()) + BTSession->downloadUrlAndSkipDialog(item->getTorrentUrl()); + else + BTSession->downloadUrlAndSkipDialog(item->getTorrentUrl(), save_path); + } else { + // All torrents are downloaded from this feed BTSession->downloadUrlAndSkipDialog(item->getTorrentUrl()); - else - BTSession->downloadUrlAndSkipDialog(item->getTorrentUrl(), save_path); - } else { - // All torrents are downloaded from this feed - BTSession->downloadUrlAndSkipDialog(item->getTorrentUrl()); + } + // Item was downloaded, consider it as Read + (*this)[item->getTitle()]->setRead(); + // Clean up + delete matching_filter; } - // Item was downloaded, consider it as Read - item->setRead(); - // Clean up - delete matching_filter; } } + } else { delete item; } @@ -604,7 +610,7 @@ void RssStream::resizeList() { unsigned int max_articles = settings.value(QString::fromUtf8("Preferences/RSS/RSSMaxArticlesPerFeed"), 100).toInt(); unsigned int nb_articles = this->size(); if(nb_articles > max_articles) { - QList listItem = sortNewsList(this->values()); + QList listItem = RssManager::sortNewsList(this->values()); int excess = nb_articles - max_articles; for(int i=0; i &list, RssItem *item) { + int i = 0; + while(i < list.size() && item->getDate() < list.at(i)->getDate()) { + ++i; + } + list.insert(i, item); + } + + static QList sortNewsList(QList news_list) { + QList new_list; + foreach(RssItem *item, news_list) { + insertSortElem(new_list, item); + } + return new_list; + } }; -static void insertSortElem(QList &list, RssItem *item) { - int i = 0; - while(i < list.size() && item->getDate() < list.at(i)->getDate()) { - ++i; - } - list.insert(i, item); -} -static QList sortNewsList(QList news_list) { - QList new_list; - foreach(RssItem *item, news_list) { - insertSortElem(new_list, item); - } - return new_list; -} + #endif diff --git a/src/rss_imp.cpp b/src/rss_imp.cpp index 7e484af39..814325085 100644 --- a/src/rss_imp.cpp +++ b/src/rss_imp.cpp @@ -431,9 +431,9 @@ void RSSImp::refreshNewsList(QTreeWidgetItem* item) { qDebug("Getting the list of news"); QList news; if(rss_item == rssmanager) - news = sortNewsList(rss_item->getUnreadNewsList()); + news = RssManager::sortNewsList(rss_item->getUnreadNewsList()); else - news = sortNewsList(rss_item->getNewsList()); + news = RssManager::sortNewsList(rss_item->getNewsList()); // Clear the list first textBrowser->clear(); previous_news = 0; diff --git a/src/src.pro b/src/src.pro index 2d4ae7815..115cc1b1b 100644 --- a/src/src.pro +++ b/src/src.pro @@ -14,7 +14,7 @@ CONFIG += qt \ network # Update this VERSION for each release -DEFINES += VERSION=\\\"v1.6.0alpha2\\\" +DEFINES += VERSION=\\\"v1.6.0beta1\\\" DEFINES += VERSION_MAJOR=1 DEFINES += VERSION_MINOR=6 DEFINES += VERSION_BUGFIX=0 @@ -90,15 +90,14 @@ contains(DEBUG_MODE, 0) { # QMAKE_CXXFLAGS_DEBUG += -fwrapv unix:QMAKE_LFLAGS_SHAPP += -rdynamic CONFIG += link_pkgconfig -PKGCONFIG += "libtorrent-rasterbar libcurl" +PKGCONFIG += "libtorrent-rasterbar" QT += network \ xml DEFINES += QT_NO_CAST_TO_ASCII -# QT_NO_CAST_FROM_ASCII # Windows # usually built as static -# win32:LIBS += -ltorrent -lcurl -lboost_system +# win32:LIBS += -ltorrent -lboost_system # win32:LIBS += -lz ? win32:LIBS += -lssl32 \ -lws2_32 \ diff --git a/src/torrentAddition.h b/src/torrentAddition.h index fe295fd8a..ba0d6d8a1 100644 --- a/src/torrentAddition.h +++ b/src/torrentAddition.h @@ -444,6 +444,8 @@ public slots: settings.setValue(QString::fromUtf8("LastDirTorrentAdd"), savePathTxt->text()); // Create .incremental file if necessary TorrentTempData::setSequential(hash, checkIncrementalDL->isChecked()); + // Skip file checking and directly start seeding + TorrentTempData::setSeedingMode(hash, addInSeed->isChecked()); // Check if there is at least one selected file if(allFiltered()){ QMessageBox::warning(0, tr("Invalid file selection"), tr("You must select at least one file in the torrent")); diff --git a/src/torrentPersistentData.h b/src/torrentPersistentData.h index 72afc15c7..ab1657804 100644 --- a/src/torrentPersistentData.h +++ b/src/torrentPersistentData.h @@ -99,6 +99,25 @@ public: } + static void setSeedingMode(QString hash,bool seed){ + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents-tmp", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + data["seeding"] = seed; + all_data[hash] = data; + settings.setValue("torrents-tmp", all_data); + } + + static bool isSeedingMode(QString hash){ + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); + QHash all_data = settings.value("torrents-tmp", QHash()).toHash(); + QHash data = all_data[hash].toHash(); + if(data.contains("seeding")) + return data["seeding"].toBool(); + return false; + } + + static QString getSavePath(QString hash) { QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent-resume")); QHash all_data = settings.value("torrents-tmp", QHash()).toHash(); From d6e90883cb1cd51d6bd796c51da34db2ac12d3bb Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sat, 7 Nov 2009 19:55:33 +0000 Subject: [PATCH 02/34] - Initial commit (both lists are merged but not all the features are there and it is probably buggy) --- src/GUI.cpp | 535 ++++------------------------------- src/GUI.h | 37 +-- src/TransferListDelegate.h | 121 ++++++++ src/TransferListWidget.cpp | 537 ++++++++++++++++++++++++++++++++++++ src/TransferListWidget.h | 95 +++++++ src/bittorrent.cpp | 25 +- src/bittorrent.h | 3 +- src/downloadingTorrents.cpp | 10 +- src/downloadingTorrents.h | 1 - src/src.pro | 7 +- 10 files changed, 821 insertions(+), 550 deletions(-) create mode 100644 src/TransferListDelegate.h create mode 100644 src/TransferListWidget.cpp create mode 100644 src/TransferListWidget.h diff --git a/src/GUI.cpp b/src/GUI.cpp index 62f98af5c..c23a89462 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -46,19 +46,17 @@ #include #include "GUI.h" -#include "downloadingTorrents.h" +#include "TransferListWidget.h" #include "misc.h" #include "createtorrent_imp.h" #include "downloadFromURLImp.h" #include "torrentAddition.h" #include "searchEngine.h" #include "rss_imp.h" -#include "FinishedTorrents.h" #include "bittorrent.h" #include "about_imp.h" #include "trackerLogin.h" #include "options_imp.h" -#include "previewSelect.h" #include "allocationDlg.h" #include #include "console_imp.h" @@ -74,7 +72,7 @@ using namespace libtorrent; *****************************************************/ // Constructor -GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), displaySpeedInTitle(false), force_exit(false), refreshInterval(1500) { +GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), displaySpeedInTitle(false), force_exit(false) { setupUi(this); setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent v0.x").arg(QString::fromUtf8(VERSION))); QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); @@ -131,47 +129,45 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis BTSession = new bittorrent(); connect(BTSession, SIGNAL(fullDiskError(QTorrentHandle&, QString)), this, SLOT(fullDiskError(QTorrentHandle&, QString))); connect(BTSession, SIGNAL(finishedTorrent(QTorrentHandle&)), this, SLOT(finishedTorrent(QTorrentHandle&))); - connect(BTSession, SIGNAL(addedTorrent(QTorrentHandle&)), this, SLOT(addedTorrent(QTorrentHandle&))); - connect(BTSession, SIGNAL(pausedTorrent(QTorrentHandle&)), this, SLOT(pausedTorrent(QTorrentHandle&))); - connect(BTSession, SIGNAL(resumedTorrent(QTorrentHandle&)), this, SLOT(resumedTorrent(QTorrentHandle&))); - connect(BTSession, SIGNAL(torrentFinishedChecking(QTorrentHandle&)), this, SLOT(checkedTorrent(QTorrentHandle&))); connect(BTSession, SIGNAL(trackerAuthenticationRequired(QTorrentHandle&)), this, SLOT(trackerAuthenticationRequired(QTorrentHandle&))); connect(BTSession, SIGNAL(newDownloadedTorrent(QString, QString)), this, SLOT(processDownloadedFiles(QString, QString))); connect(BTSession, SIGNAL(downloadFromUrlFailure(QString, QString)), this, SLOT(handleDownloadFromUrlFailure(QString, QString))); - connect(BTSession, SIGNAL(deletedTorrent(QString)), this, SLOT(deleteTorrent(QString))); - connect(BTSession, SIGNAL(torrentPaused(QTorrentHandle&)), this, SLOT(setPaused(QTorrentHandle&))); + qDebug("create tabWidget"); tabs = new QTabWidget(); - // Download torrents tab - downloadingTorrentTab = new DownloadingTorrents(this, BTSession); - tabs->addTab(downloadingTorrentTab, tr("Downloads") + QString::fromUtf8(" (0/0)")); - tabs->setTabIcon(0, QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))); + // Transfer List tab + transferList = new TransferListWidget(tabs, BTSession); + int index_tab = tabs->addTab(transferList, tr("Transfers")); + tabs->setTabIcon(index_tab, QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))); vboxLayout->addWidget(tabs); - connect(downloadingTorrentTab, SIGNAL(unfinishedTorrentsNumberChanged(unsigned int)), this, SLOT(updateUnfinishedTorrentNumber(unsigned int))); - connect(downloadingTorrentTab, SIGNAL(torrentDoubleClicked(QString, bool)), this, SLOT(torrentDoubleClicked(QString, bool))); - // Finished torrents tab - finishedTorrentTab = new FinishedTorrents(this, BTSession); - tabs->addTab(finishedTorrentTab, tr("Uploads") + QString::fromUtf8(" (0/0)")); - tabs->setTabIcon(1, QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))); - connect(finishedTorrentTab, SIGNAL(torrentDoubleClicked(QString, bool)), this, SLOT(torrentDoubleClicked(QString, bool))); - connect(finishedTorrentTab, SIGNAL(finishedTorrentsNumberChanged(unsigned int)), this, SLOT(updateFinishedTorrentNumber(unsigned int))); + + // Transfer list slots + connect(actionStart, SIGNAL(triggered()), transferList, SLOT(startSelectedTorrents())); + connect(actionStart_All, SIGNAL(triggered()), transferList, SLOT(startAllTorrents())); + connect(actionPause, SIGNAL(triggered()), transferList, SLOT(pauseSelectedTorrents())); + connect(actionPause_All, SIGNAL(triggered()), transferList, SLOT(pauseAllTorrents())); + connect(actionDelete, SIGNAL(triggered()), transferList, SLOT(deleteSelectedTorrents())); + connect(actionDelete_Permanently, SIGNAL(triggered()), transferList, SLOT(deletePermSelectedTorrents())); + connect(actionIncreasePriority, SIGNAL(triggered()), transferList, SLOT(increasePrioSelectedTorrents())); + connect(actionDecreasePriority, SIGNAL(triggered()), transferList, SLOT(decreasePrioSelectedTorrents())); + + //connect(downloadingTorrentTab, SIGNAL(unfinishedTorrentsNumberChanged(unsigned int)), this, SLOT(updateUnfinishedTorrentNumber(unsigned int))); + //connect(downloadingTorrentTab, SIGNAL(torrentDoubleClicked(QString, bool)), this, SLOT(torrentDoubleClicked(QString, bool))); // Search engine tab searchEngine = new SearchEngine(BTSession, myTrayIcon, systrayIntegration); - tabs->addTab(searchEngine, tr("Search")); - tabs->setTabIcon(2, QIcon(QString::fromUtf8(":/Icons/oxygen/edit-find.png"))); + index_tab = tabs->addTab(searchEngine, tr("Search")); + tabs->setTabIcon(index_tab, QIcon(QString::fromUtf8(":/Icons/oxygen/edit-find.png"))); readSettings(); // RSS Tab rssWidget = 0; - // Start download list refresher - refresher = new QTimer(this); - connect(refresher, SIGNAL(timeout()), this, SLOT(updateLists())); - refresher->start(1500); + // Configure BT session according to options configureSession(true); // Resume unfinished torrents BTSession->startUpTorrents(); - downloadingTorrentTab->loadLastSortedColumn(); - finishedTorrentTab->loadLastSortedColumn(); + // FIXME: Sorting + //downloadingTorrentTab->loadLastSortedColumn(); + //finishedTorrentTab->loadLastSortedColumn(); // Add torrent given on command line processParams(torrentCmdLine); // Initialize Web UI @@ -264,9 +260,7 @@ GUI::~GUI() { if(rssWidget != 0) delete rssWidget; delete searchEngine; - delete refresher; - delete downloadingTorrentTab; - delete finishedTorrentTab; + delete transferList; delete checkConnect; qDebug("1"); if(systrayCreator) { @@ -301,8 +295,8 @@ void GUI::displayRSSTab(bool enable) { // RSS tab if(rssWidget == 0) { rssWidget = new RSSImp(BTSession); - tabs->addTab(rssWidget, tr("RSS")); - tabs->setTabIcon(3, QIcon(QString::fromUtf8(":/Icons/rss32.png"))); + int index_tab = tabs->addTab(rssWidget, tr("RSS")); + tabs->setTabIcon(index_tab, QIcon(QString::fromUtf8(":/Icons/rss32.png"))); } } else { if(rssWidget != 0) { @@ -363,92 +357,22 @@ void GUI::writeSettings() { // called when a torrent has finished void GUI::finishedTorrent(QTorrentHandle& h) const { - qDebug("In GUI, a torrent has finished"); - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - bool show_msg = true; - if(TorrentPersistentData::isSeed(h.hash())) - show_msg = false; - QString fileName = h.name(); - bool useNotificationBalloons = settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool(); - // Add it to finished tab - QString hash = h.hash(); - if(show_msg) - BTSession->addConsoleMessage(tr("%1 has finished downloading.", "e.g: xxx.avi has finished downloading.").arg(fileName)); - downloadingTorrentTab->deleteTorrent(hash); - finishedTorrentTab->addTorrent(hash); - if(show_msg && systrayIntegration && useNotificationBalloons) { - myTrayIcon->showMessage(tr("Download finished"), tr("%1 has finished downloading.", "e.g: xxx.avi has finished downloading.").arg(fileName), QSystemTrayIcon::Information, TIME_TRAY_BALLOON); - } -} - -void GUI::addedTorrent(QTorrentHandle& h) const { - if(h.is_seed()) { - finishedTorrentTab->addTorrent(h.hash()); - } else { - downloadingTorrentTab->addTorrent(h.hash()); - } -} - -void GUI::pausedTorrent(QTorrentHandle& h) const { - if(h.is_seed()) { - finishedTorrentTab->pauseTorrent(h.hash()); - } else { - downloadingTorrentTab->pauseTorrent(h.hash()); - } -} - -void GUI::resumedTorrent(QTorrentHandle& h) const { - if(h.is_seed()) { - finishedTorrentTab->updateTorrent(h); - } else { - downloadingTorrentTab->updateTorrent(h); - } -} - -void GUI::checkedTorrent(QTorrentHandle& h) const { - if(h.is_seed()) { - // Move torrent to finished tab - downloadingTorrentTab->deleteTorrent(h.hash()); - finishedTorrentTab->addTorrent(h.hash()); - } else { - // Move torrent back to download list (if necessary) - if(TorrentPersistentData::isSeed(h.hash())) { - TorrentPersistentData::saveSeedStatus(h); - finishedTorrentTab->deleteTorrent(h.hash()); - downloadingTorrentTab->addTorrent(h.hash()); - } - } + if(!TorrentPersistentData::isSeed(h.hash())) + showNotificationBaloon(tr("Download completion"), tr("%1 has finished downloading.", "e.g: xxx.avi has finished downloading.").arg(h.name())); } // Notification when disk is full void GUI::fullDiskError(QTorrentHandle& h, QString msg) const { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - bool useNotificationBalloons = settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool(); - if(systrayIntegration && useNotificationBalloons) { - myTrayIcon->showMessage(tr("I/O Error", "i.e: Input/Output Error"), tr("An I/O error occured for torrent %1.\n Reason: %2", "e.g: An error occured for torrent xxx.avi.\n Reason: disk is full.").arg(h.name()).arg(msg), QSystemTrayIcon::Critical, TIME_TRAY_BALLOON); - } + if(!h.is_valid()) return; + showNotificationBaloon(tr("I/O Error", "i.e: Input/Output Error"), tr("An I/O error occured for torrent %1.\n Reason: %2", "e.g: An error occured for torrent xxx.avi.\n Reason: disk is full.").arg(h.name()).arg(msg)); // Download will be paused by libtorrent. Updating GUI information accordingly QString hash = h.hash(); qDebug("Full disk error, pausing torrent %s", hash.toLocal8Bit().data()); - setPaused(h); + h.pause(); + transferList->pauseTorrent(h.hash()); BTSession->addConsoleMessage(tr("An error occured (full disk?), '%1' paused.", "e.g: An error occured (full disk?), 'xxx.avi' paused.").arg(h.name())); } -void GUI::setPaused(QTorrentHandle &h) const { - if(!h.is_paused()) { - // FIXME in v1.6.0: Add Error state and stop using pause for this - h.pause(); - } - qDebug("Marking torrent %s as paused", h.hash().toLocal8Bit().data()); - if(h.is_seed()) { - // In finished list - qDebug("Automatically paused torrent was in finished list"); - finishedTorrentTab->pauseTorrent(h.hash()); - }else{ - downloadingTorrentTab->pauseTorrent(h.hash()); - } -} - void GUI::createKeyboardShortcuts() { actionCreate_torrent->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+N"))); actionOpen->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+O"))); @@ -548,86 +472,6 @@ void GUI::on_actionSet_global_download_limit_triggered() { new BandwidthAllocationDialog(this, false, BTSession, QStringList()); } -void GUI::on_actionPreview_file_triggered() { - QString hash; - switch(tabs->currentIndex()){ - case 0: - hash = downloadingTorrentTab->getSelectedTorrents(true).first(); - break; - case 1: - hash = finishedTorrentTab->getSelectedTorrents(true).first(); - break; - default: - return; - } - QTorrentHandle h = BTSession->getTorrentHandle(hash); - new previewSelect(this, h); -} - -void GUI::openDestinationFolder() const { - QStringList hashes; - switch(tabs->currentIndex()){ - case 0: - hashes = downloadingTorrentTab->getSelectedTorrents(true); - break; - case 1: - hashes = finishedTorrentTab->getSelectedTorrents(true); - break; - default: - return; - } - QStringList pathsList; - foreach(const QString &hash, hashes) { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - QString savePath = h.save_path(); - if(!pathsList.contains(savePath)) { - pathsList.append(savePath); - QDesktopServices::openUrl(QString("file://")+savePath); - } - } -} - -void GUI::copyMagnetURI() const { - QStringList hashes; - switch(tabs->currentIndex()){ - case 0: - hashes = downloadingTorrentTab->getSelectedTorrents(); - break; - case 1: - hashes = finishedTorrentTab->getSelectedTorrents(); - break; - default: - return; - } - QStringList magnet_uris; - foreach(QString hash, hashes) { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(h.is_valid()) { - magnet_uris << misc::toQString(make_magnet_uri(h.get_torrent_info())); - } - } - qApp->clipboard()->setText(magnet_uris.join("\n")); -} - -void GUI::goBuyPage() const { - QStringList hashes; - switch(tabs->currentIndex()){ - case 0: - hashes = downloadingTorrentTab->getSelectedTorrents(true); - break; - case 1: - hashes = finishedTorrentTab->getSelectedTorrents(true); - break; - default: - return; - } - QStringList pathsList; - foreach(const QString &hash, hashes) { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - QDesktopServices::openUrl("http://match.sharemonkey.com/?info_hash="+hash+"&n="+h.name()+"&cid=33"); - } -} - // Necessary if we want to close the window // in one time if "close to systray" is enabled void GUI::on_actionExit_triggered() { @@ -693,7 +537,7 @@ void GUI::on_actionAbout_triggered() { void GUI::showEvent(QShowEvent *e) { qDebug("** Show Event **"); - updateLists(true); + //updateLists(true); e->accept(); } @@ -708,14 +552,14 @@ void GUI::closeEvent(QCloseEvent *e) { e->accept(); return; } - if(settings.value(QString::fromUtf8("Preferences/General/ExitConfirm"), true).toBool() && downloadingTorrentTab->getNbTorrentsInList()) { + if(settings.value(QString::fromUtf8("Preferences/General/ExitConfirm"), true).toBool() && BTSession->hasActiveTorrents()) { show(); if(!isMaximized()) showNormal(); if(e->spontaneous() == true || force_exit == true) { if(QMessageBox::question(this, tr("Are you sure you want to quit?")+QString::fromUtf8(" -- ")+tr("qBittorrent"), - tr("The download list is not empty.\nAre you sure you want to quit qBittorrent?"), + tr("Some files are currently transferring.\nAre you sure you want to quit qBittorrent?"), tr("&Yes"), tr("&No"), QString(), 0, 1)) { e->ignore(); @@ -838,101 +682,6 @@ void GUI::on_actionOpen_triggered() { } } -// delete from download list AND from hard drive -void GUI::on_actionDelete_Permanently_triggered() { - QStringList hashes; - bool inDownloadList = true; - switch(tabs->currentIndex()){ - case 0: - hashes = downloadingTorrentTab->getSelectedTorrents(); - break; - case 1: - hashes = finishedTorrentTab->getSelectedTorrents(); - inDownloadList = false; - break; - default: - return; - } - if(hashes.empty()) return; - int ret; - if(inDownloadList) { - ret = QMessageBox::question( - this, - tr("Are you sure? -- qBittorrent"), - tr("Are you sure you want to delete the selected item(s) from download list and from hard drive?"), - tr("&Yes"), tr("&No"), - QString(), 0, 1); - }else{ - ret = QMessageBox::question( - this, - tr("Are you sure? -- qBittorrent"), - tr("Are you sure you want to delete the selected item(s) from finished list and from hard drive?"), - tr("&Yes"), tr("&No"), - QString(), 0, 1); - } - if(ret) return; - //User clicked YES - foreach(const QString &hash, hashes) { - // Get the file name - QTorrentHandle h = BTSession->getTorrentHandle(hash); - QString fileName = h.name(); - // Remove the torrent - BTSession->deleteTorrent(hash, true); - } -} - -void GUI::deleteTorrent(QString hash) { - // Delete item from list - downloadingTorrentTab->deleteTorrent(hash); - finishedTorrentTab->deleteTorrent(hash); -} - -// delete selected items in the list -void GUI::on_actionDelete_triggered() { - QStringList hashes; - bool inDownloadList = true; - switch(tabs->currentIndex()){ - case 0: // DL - hashes = downloadingTorrentTab->getSelectedTorrents(); - break; - case 1: // SEED - hashes = finishedTorrentTab->getSelectedTorrents(); - inDownloadList = false; - break; - case 3: //RSSImp - rssWidget->deleteSelectedItems(); - return; - default: - return; - } - if(hashes.empty()) return; - int ret; - if(inDownloadList) { - ret = QMessageBox::question( - this, - tr("Are you sure? -- qBittorrent"), - tr("Are you sure you want to delete the selected item(s) in download list?"), - tr("&Yes"), tr("&No"), - QString(), 0, 1); - } else { - ret = QMessageBox::question( - this, - tr("Are you sure? -- qBittorrent"), - tr("Are you sure you want to delete the selected item(s) in finished list?"), - tr("&Yes"), tr("&No"), - QString(), 0, 1); - } - if(ret) return; - //User clicked YES - foreach(const QString &hash, hashes) { - // Get the file name - QTorrentHandle h = BTSession->getTorrentHandle(hash); - QString fileName = h.name(); - // Remove the torrent - BTSession->deleteTorrent(hash, false); - } -} - // As program parameters, we can get paths or urls. // This function parse the parameters and call // the right addTorrent function, considering @@ -993,10 +742,7 @@ void GUI::configureSession(bool deleteOptions) { toolBar->setVisible(false); } unsigned int new_refreshInterval = options->getRefreshInterval(); - if(refreshInterval != new_refreshInterval) { - refreshInterval = new_refreshInterval; - refresher->start(refreshInterval); - } + transferList->setRefreshInterval(new_refreshInterval); // Downloads // * Save path BTSession->setDefaultSavePath(options->getSavePath()); @@ -1069,7 +815,7 @@ void GUI::configureSession(bool deleteOptions) { // Queueing System if(options->isQueueingSystemEnabled()) { if(!BTSession->isQueueingEnabled()) { - downloadingTorrentTab->hidePriorityColumn(false); + transferList->hidePriorityColumn(false); actionDecreasePriority->setVisible(true); actionIncreasePriority->setVisible(true); prioSeparator->setVisible(true); @@ -1090,7 +836,7 @@ void GUI::configureSession(bool deleteOptions) { sessionSettings.active_seeds = -1; sessionSettings.active_limit = -1; BTSession->setQueueingEnabled(false); - downloadingTorrentTab->hidePriorityColumn(true); + transferList->hidePriorityColumn(true); actionDecreasePriority->setVisible(false); actionIncreasePriority->setVisible(false); prioSeparator->setVisible(false); @@ -1247,182 +993,6 @@ void GUI::configureSession(bool deleteOptions) { qDebug("Session configured"); } -void GUI::updateUnfinishedTorrentNumber(unsigned int nb) { - unsigned int paused = BTSession->getUnfinishedPausedTorrentsNb(); - tabs->setTabText(0, tr("Downloads") +QString::fromUtf8(" (")+misc::toQString(nb-paused)+"/"+misc::toQString(nb)+QString::fromUtf8(")")); -} - -void GUI::updateFinishedTorrentNumber(unsigned int nb) { - unsigned int paused = BTSession->getFinishedPausedTorrentsNb(); - tabs->setTabText(1, tr("Finished") +QString::fromUtf8(" (")+misc::toQString(nb-paused)+"/"+misc::toQString(nb)+QString::fromUtf8(")")); -} - -// Allow to change action on double-click -void GUI::torrentDoubleClicked(QString hash, bool finished) { - int action; - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - QTorrentHandle h = BTSession->getTorrentHandle(hash); - - if(finished) { - action = settings.value(QString::fromUtf8("Preferences/Downloads/DblClOnTorFN"), 0).toInt(); - } else { - action = settings.value(QString::fromUtf8("Preferences/Downloads/DblClOnTorDl"), 0).toInt(); - } - - switch(action) { - case TOGGLE_PAUSE: - this->togglePausedState(hash); - break; - case OPEN_DEST: { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - QString savePath = h.save_path(); - QDesktopServices::openUrl(QUrl(savePath)); - break; - } - case SHOW_PROPERTIES : - if(finished) { - finishedTorrentTab->showPropertiesFromHash(hash); - } else { - downloadingTorrentTab->showPropertiesFromHash(hash); - } - break; - } -} - -// Toggle paused state of selected torrent -void GUI::togglePausedState(QString hash) { - if(tabs->currentIndex() > 1) return; - bool inDownloadList = true; - if(tabs->currentIndex() == 1) - inDownloadList = false; - QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(h.is_paused()) { - h.resume(); - resumedTorrent(h); - if(inDownloadList) { - updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); - }else{ - updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); - } - }else{ - h.pause(); - pausedTorrent(h); - if(inDownloadList) { - updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); - }else{ - updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); - } - } -} - -// Pause All Downloads in DL list -void GUI::on_actionPause_All_triggered() { - bool change = false; - std::vector torrents = BTSession->getTorrents(); - std::vector::iterator torrentIT; - for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { - QTorrentHandle h = QTorrentHandle(*torrentIT); - if(!h.is_valid() || h.is_paused()) continue; - change = true; - h.pause(); - pausedTorrent(h); - } - if(change) { - updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); - updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); - } -} - -void GUI::on_actionIncreasePriority_triggered() { - if(tabs->currentIndex() != 0) - return; - QStringList hashes = downloadingTorrentTab->getSelectedTorrents(); - foreach(const QString &hash, hashes) { - BTSession->increaseDlTorrentPriority(hash); - } - updateLists(); -} - -void GUI::on_actionDecreasePriority_triggered() { - Q_ASSERT(tabs->currentIndex() == 0); - QStringList hashes = downloadingTorrentTab->getSelectedTorrents(); - foreach(const QString &hash, hashes) { - BTSession->decreaseDlTorrentPriority(hash); - } - updateLists(); -} - -// pause selected items in the list -void GUI::on_actionPause_triggered() { - bool inDownloadList = true; - if(tabs->currentIndex() > 1) return; - if(tabs->currentIndex() == 1) - inDownloadList = false; - QStringList hashes; - if(inDownloadList) { - hashes = downloadingTorrentTab->getSelectedTorrents(); - } else { - hashes = finishedTorrentTab->getSelectedTorrents(); - } - qDebug("nb hashes: %d", hashes.size()); - foreach(const QString &hash, hashes) { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(!h.is_paused()){ - h.pause(); - pausedTorrent(h); - if(inDownloadList) { - updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); - } else { - updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); - } - } - } -} - -// Resume All Downloads in DL list -void GUI::on_actionStart_All_triggered() { - bool change = false; - std::vector torrents = BTSession->getTorrents(); - std::vector::iterator torrentIT; - for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { - QTorrentHandle h = QTorrentHandle(*torrentIT); - if(!h.is_valid() || !h.is_paused()) continue; - change = true; - h.resume(); - resumedTorrent(h); - } - if(change) { - updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); - updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); - } -} - -// start selected items in the list -void GUI::on_actionStart_triggered() { - bool inDownloadList = true; - if(tabs->currentIndex() > 1) return; - if(tabs->currentIndex() == 1) - inDownloadList = false; - QStringList hashes; - if(inDownloadList) { - hashes = downloadingTorrentTab->getSelectedTorrents(); - } else { - hashes = finishedTorrentTab->getSelectedTorrents(); - } - foreach(const QString &hash, hashes) { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(h.is_paused()){ - h.resume(); - resumedTorrent(h); - if(inDownloadList) { - updateUnfinishedTorrentNumber(downloadingTorrentTab->getNbTorrentsInList()); - } else { - updateFinishedTorrentNumber(finishedTorrentTab->getNbTorrentsInList()); - } - } - } -} - void GUI::addUnauthenticatedTracker(QPair tracker) { // Trackers whose authentication was cancelled if(unauthenticated_trackers.indexOf(tracker) < 0) { @@ -1430,19 +1000,7 @@ void GUI::addUnauthenticatedTracker(QPair tracker) { } } -// display properties of selected items -void GUI::on_actionTorrent_Properties_triggered() { - if(tabs->currentIndex() > 1) return; - switch(tabs->currentIndex()){ - case 1: // DL List - finishedTorrentTab->propertiesSelection(); - break; - default: - downloadingTorrentTab->propertiesSelection(); - } -} - -void GUI::updateLists(bool force) { +/*void GUI::updateLists(bool force) { if(isVisible() || force) { // update global informations dlSpeedLbl->setText(tr("DL: %1 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1)))); @@ -1474,7 +1032,7 @@ void GUI::updateLists(bool force) { QString up_rate = QByteArray::number(BTSession->getSessionStatus().payload_upload_rate/1024, 'f', 1); setWindowTitle(tr("qBittorrent %1 (DL: %2KiB/s, UP: %3KiB/s)", "%1 is qBittorrent version").arg(QString::fromUtf8(VERSION)).arg(dl_rate).arg(up_rate)); } -} +}*/ // Called when a tracker requires authentication void GUI::trackerAuthenticationRequired(QTorrentHandle& h) { @@ -1520,6 +1078,13 @@ void GUI::checkConnectionStatus() { } } +void GUI::showNotificationBaloon(QString title, QString msg) const { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + if(systrayIntegration && settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool()) { + myTrayIcon->showMessage(title, msg, QSystemTrayIcon::Information, TIME_TRAY_BALLOON); + } +} + /***************************************************** * * * Utils * diff --git a/src/GUI.h b/src/GUI.h index 1c789f7fc..59fd72069 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -40,8 +40,6 @@ class bittorrent; class createtorrent; class QTimer; -class DownloadingTorrents; -class FinishedTorrents; class downloadFromURL; class SearchEngine; class QLocalServer; @@ -57,6 +55,7 @@ class QLabel; class QModelIndex; class HttpServer; class QFrame; +class TransferListWidget; class GUI : public QMainWindow, private Ui::MainWindow{ Q_OBJECT @@ -73,14 +72,12 @@ class GUI : public QMainWindow, private Ui::MainWindow{ QSystemTrayIcon *myTrayIcon; QPointer systrayCreator; QMenu *myTrayIconMenu; - DownloadingTorrents *downloadingTorrentTab; - FinishedTorrents *finishedTorrentTab; + TransferListWidget *transferList; QLabel *connecStatusLblIcon; bool systrayIntegration; bool displaySpeedInTitle; bool force_exit; - unsigned int refreshInterval; - QTimer *refresher; + //unsigned int refreshInterval; QLabel *dlSpeedLbl; QLabel *upSpeedLbl; QLabel *ratioLbl; @@ -119,21 +116,15 @@ class GUI : public QMainWindow, private Ui::MainWindow{ void on_actionShow_console_triggered(); void readParamsOnSocket(); void acceptConnection(); - void togglePausedState(QString hash); - void torrentDoubleClicked(QString hash, bool finished); - void on_actionPreview_file_triggered(); void previewFile(QString filePath); void balloonClicked(); void writeSettings(); void readSettings(); void on_actionExit_triggered(); void createTrayIcon(); - void updateUnfinishedTorrentNumber(unsigned int nb); - void updateFinishedTorrentNumber(unsigned int nb); void fullDiskError(QTorrentHandle& h, QString msg) const; void handleDownloadFromUrlFailure(QString, QString) const; void createSystrayDelayed(); - void setPaused(QTorrentHandle &h) const; // Keyboard shortcuts void createKeyboardShortcuts(); void displayDownTab() const; @@ -141,17 +132,10 @@ class GUI : public QMainWindow, private Ui::MainWindow{ void displaySearchTab() const; void displayRSSTab() const; // Torrent actions - void on_actionTorrent_Properties_triggered(); - void on_actionPause_triggered(); - void on_actionPause_All_triggered(); - void on_actionStart_triggered(); - void on_actionStart_All_triggered(); - void on_actionOpen_triggered(); - void on_actionDelete_Permanently_triggered(); - void on_actionDelete_triggered(); void on_actionSet_global_upload_limit_triggered(); void on_actionSet_global_download_limit_triggered(); void on_actionDocumentation_triggered() const; + void on_actionOpen_triggered(); void checkConnectionStatus(); void configureSession(bool deleteOptions); void processParams(const QStringList& params); @@ -159,16 +143,9 @@ class GUI : public QMainWindow, private Ui::MainWindow{ void addUnauthenticatedTracker(QPair tracker); void processDownloadedFiles(QString path, QString url); void downloadFromURLList(const QStringList& urls); - void deleteTorrent(QString hash); void finishedTorrent(QTorrentHandle& h) const; - void addedTorrent(QTorrentHandle& h) const; - void checkedTorrent(QTorrentHandle& h) const; - void pausedTorrent(QTorrentHandle& h) const; - void resumedTorrent(QTorrentHandle& h) const; - void updateLists(bool force=false); + //void updateLists(bool force=false); bool initWebUi(QString username, QString password, int port); - void on_actionIncreasePriority_triggered(); - void on_actionDecreasePriority_triggered(); void scrapeTrackers(); // Options slots void on_actionOptions_triggered(); @@ -180,10 +157,8 @@ class GUI : public QMainWindow, private Ui::MainWindow{ public slots: void trackerAuthenticationRequired(QTorrentHandle& h); void setTabText(int index, QString text) const; - void openDestinationFolder() const; - void goBuyPage() const; - void copyMagnetURI() const; void updateRatio(); + void showNotificationBaloon(QString title, QString msg) const; protected: void closeEvent(QCloseEvent *); diff --git a/src/TransferListDelegate.h b/src/TransferListDelegate.h new file mode 100644 index 000000000..e8de0ee36 --- /dev/null +++ b/src/TransferListDelegate.h @@ -0,0 +1,121 @@ +/* + * 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 TRANSFERLISTDELEGATE_H +#define TRANSFERLISTDELEGATE_H + +#include +#include +#include +#include +#include +#include +#include "misc.h" + +// Defines for download list list columns +#define NAME 0 +#define SIZE 1 +#define PROGRESS 2 +#define DLSPEED 3 +#define UPSPEED 4 +#define SEEDSLEECH 5 +#define RATIO 6 +#define ETA 7 +#define PRIORITY 8 +#define HASH 9 + +class TransferListDelegate: public QItemDelegate { + Q_OBJECT + +public: + TransferListDelegate(QObject *parent) : QItemDelegate(parent){} + + ~TransferListDelegate(){} + + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); + switch(index.column()){ + case SIZE: + QItemDelegate::drawBackground(painter, opt, index); + QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); + break; + case ETA: + QItemDelegate::drawBackground(painter, opt, index); + QItemDelegate::drawDisplay(painter, opt, option.rect, misc::userFriendlyDuration(index.data().toLongLong())); + break; + case UPSPEED: + case DLSPEED:{ + QItemDelegate::drawBackground(painter, opt, index); + double speed = index.data().toDouble(); + QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(speed/1024., 'f', 1))+QString::fromUtf8(" ")+tr("KiB/s")); + break; + } + case RATIO:{ + QItemDelegate::drawBackground(painter, opt, index); + double ratio = index.data().toDouble(); + if(ratio > 100.) + QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8("∞")); + else + QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1))); + break; + } + case PRIORITY: { + int priority = index.data().toInt(); + if(priority >= 0) + QItemDelegate::paint(painter, option, index); + break; + } + case PROGRESS:{ + QStyleOptionProgressBarV2 newopt; + double progress = index.data().toDouble()*100.; + newopt.rect = opt.rect; + newopt.text = QString(QByteArray::number(progress, 'f', 1))+QString::fromUtf8("%"); + newopt.progress = (int)progress; + newopt.maximum = 100; + newopt.minimum = 0; + newopt.state |= QStyle::State_Enabled; + newopt.textVisible = true; + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, + painter); + break; + } + default: + QItemDelegate::paint(painter, option, index); + } + } + + QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const { + // No editor here + return 0; + } + +}; + +#endif // TRANSFERLISTDELEGATE_H diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp new file mode 100644 index 000000000..34f516436 --- /dev/null +++ b/src/TransferListWidget.cpp @@ -0,0 +1,537 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include "TransferListWidget.h" +#include "TransferListDelegate.h" +#include "bittorrent.h" +#include "torrentPersistentData.h" +#include "previewSelect.h" +#include "options_imp.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +TransferListWidget::TransferListWidget(QWidget *parent, bittorrent *_BTSession): QTreeView(parent) { + QSettings settings("qBittorrent", "qBittorrent"); + BTSession = _BTSession; + + // Create and apply delegate + listDelegate = new TransferListDelegate(this); + setItemDelegate(listDelegate); + + // Create transfer list model + listModel = new QStandardItemModel(0,10); + listModel->setHeaderData(NAME, Qt::Horizontal, tr("Name", "i.e: file name")); + listModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); + listModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress", "i.e: % downloaded")); + listModel->setHeaderData(DLSPEED, Qt::Horizontal, tr("DL Speed", "i.e: Download speed")); + listModel->setHeaderData(UPSPEED, Qt::Horizontal, tr("UP Speed", "i.e: Upload speed")); + listModel->setHeaderData(SEEDSLEECH, Qt::Horizontal, tr("Seeds/Leechers", "i.e: full/partial sources")); + listModel->setHeaderData(RATIO, Qt::Horizontal, tr("Ratio")); + listModel->setHeaderData(ETA, Qt::Horizontal, tr("ETA", "i.e: Estimated Time of Arrival / Time left")); + listModel->setHeaderData(PRIORITY, Qt::Horizontal, "#"); + + // Set Sort/Filter proxy + proxyModel = new QSortFilterProxyModel(); + proxyModel->setDynamicSortFilter(true); + proxyModel->setSourceModel(listModel); + setModel(proxyModel); + + // Visual settings + setRootIsDecorated(false); + setAllColumnsShowFocus(true); + setSortingEnabled(true); + hideColumn(PRIORITY); + hideColumn(HASH); + loadHiddenColumns(); + setContextMenuPolicy(Qt::CustomContextMenu); + + // Listen for BTSession events + connect(BTSession, SIGNAL(addedTorrent(QTorrentHandle&)), this, SLOT(addTorrent(QTorrentHandle&))); + connect(BTSession, SIGNAL(finishedTorrent(QTorrentHandle&)), this, SLOT(setFinished(QTorrentHandle&))); + + // Listen for list events + connect(this, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(torrentDoubleClicked(QModelIndex))); + connect(header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayDLHoSMenu(const QPoint&))); + + // Refresh timer + refreshTimer = new QBasicTimer(); + refreshTimer->start(settings.value("Preferences/General/RefreshInterval", 1500).toInt(), this); +} + +TransferListWidget::~TransferListWidget() { + saveHiddenColumns(); + delete refreshTimer; + delete proxyModel; + delete listModel; + delete listDelegate; +} + +void TransferListWidget::timerEvent(QTimerEvent*) { + refreshList(); +} + +void TransferListWidget::addTorrent(QTorrentHandle& h) { + if(!h.is_valid()) return; + int row = listModel->rowCount(); + try { + // Adding torrent to transfer list + listModel->insertRow(row); + listModel->setData(listModel->index(row, NAME), QVariant(h.name())); + listModel->setData(listModel->index(row, SIZE), QVariant((qlonglong)h.actual_size())); + if(BTSession->isQueueingEnabled() && !h.is_seed()) + listModel->setData(listModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(h.hash()))); + listModel->setData(listModel->index(row, HASH), QVariant(h.hash())); + // Pause torrent if it is + if(h.is_paused()) { + listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/paused.png"))), Qt::DecorationRole); + //setRowColor(row, QString::fromUtf8("red")); + }else{ + listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/stalled.png"))), Qt::DecorationRole); + //setRowColor(row, QString::fromUtf8("grey")); + } + } catch(invalid_handle e) { + // Remove added torrent + listModel->removeRow(row); + } +} + +/*void TransferListWidget::setRowColor(int row, QColor color) { + unsigned int nbColumns = listModel->columnCount()-1; + for(unsigned int i=0; isetData(listModel->index(row, i), QVariant(color), Qt::ForegroundRole); + } +}*/ + +void TransferListWidget::deleteTorrent(int row) { + listModel->removeRow(row); +} + +void TransferListWidget::pauseTorrent(QString hash) { + pauseTorrent(getRowFromHash(hash)); +} + +void TransferListWidget::pauseTorrent(int row) { + qDebug("Torrent visibly paused"); + listModel->setData(listModel->index(row, DLSPEED), QVariant((double)0.0)); + listModel->setData(listModel->index(row, UPSPEED), QVariant((double)0.0)); + listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); + listModel->setData(listModel->index(row, NAME), QIcon(QString::fromUtf8(":/Icons/skin/paused.png")), Qt::DecorationRole); + listModel->setData(listModel->index(row, SEEDSLEECH), QVariant(QString::fromUtf8("0/0"))); + //setRowColor(row, QString::fromUtf8("red")); +} + +void TransferListWidget::resumeTorrent(int row) { + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(row)); + if(!h.is_valid()) return; + if(h.is_seed()) + listModel->setData(listModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/seeding.png")), Qt::DecorationRole); + updateTorrent(row); +} + +void TransferListWidget::updateTorrent(int row) { + QString hash = getHashFromRow(row); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(!h.is_valid()) { + // Delete torrent + deleteTorrent(row); + return; + } + try { + if(h.is_paused()) return; + if(!h.is_seed()) { + // Queueing code + if(BTSession->isQueueingEnabled()) { + listModel->setData(listModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash))); + if(h.is_queued()) { + if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking) { + listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, PROGRESS), QVariant((double)h.progress())); + }else { + listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); + } + // Reset speeds and seeds/leech + listModel->setData(listModel->index(row, DLSPEED), QVariant((double)0.)); + listModel->setData(listModel->index(row, UPSPEED), QVariant((double)0.)); + listModel->setData(listModel->index(row, SEEDSLEECH), QVariant("0/0")); + //setRowColor(row, QString::fromUtf8("grey")); + return; + } + } + // Update + listModel->setData(listModel->index(row, PROGRESS), QVariant((double)h.progress())); + listModel->setData(listModel->index(row, DLSPEED), QVariant((double)h.download_payload_rate())); + + // Parse download state + switch(h.state()) { + case torrent_status::checking_files: + case torrent_status::queued_for_checking: + case torrent_status::checking_resume_data: + listModel->setData(listModel->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) { + listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)BTSession->getETA(hash))); + //setRowColor(row, QString::fromUtf8("green")); + }else{ + listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/stalled.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); + //setRowColor(row, QApplication::palette().color(QPalette::WindowText)); + } + listModel->setData(listModel->index(row, UPSPEED), QVariant((double)h.upload_payload_rate())); + break; + default: + listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); + } + } + + // Common to both downloads and uploads + 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(")")); + listModel->setData(listModel->index(row, SEEDSLEECH), QVariant(tmp)); + listModel->setData(listModel->index(row, RATIO), QVariant(misc::toQString(BTSession->getRealRatio(hash)))); + listModel->setData(listModel->index(row, UPSPEED), QVariant((double)h.upload_payload_rate())); + // FIXME: Add all_time_upload column + }catch(invalid_handle e) { + deleteTorrent(row); + qDebug("Caught Invalid handle exception, lucky us."); + } +} + +void TransferListWidget::setFinished(QTorrentHandle &h) { + int row = -1; + try { + row = getRowFromHash(h.hash()); + if(row >= 0) { + if(h.is_paused()) { + listModel->setData(listModel->index(row, NAME), QIcon(":/Icons/skin/paused.png"), Qt::DecorationRole); + //setRowColor(row, "red"); + }else{ + listModel->setData(listModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/seeding.png")), Qt::DecorationRole); + //setRowColor(row, "orange"); + } + listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); + listModel->setData(listModel->index(row, DLSPEED), QVariant((double)0.)); + listModel->setData(listModel->index(row, PROGRESS), QVariant((double)1.)); + listModel->setData(listModel->index(row, PRIORITY), QVariant((int)-1)); + } + } catch(invalid_handle e) { + if(row >= 0) deleteTorrent(row); + } +} + +void TransferListWidget::setRefreshInterval(int t) { + refreshTimer->start(t, this); +} + +void TransferListWidget::refreshList() { + for(int i=0; irowCount(); ++i) { + updateTorrent(i); + } +} + +int TransferListWidget::getRowFromHash(QString hash) const{ + QList items = listModel->findItems(hash, Qt::MatchExactly, HASH); + if(items.empty()) return -1; + Q_ASSERT(items.size() == 1); + return items.first()->row(); +} + +QString TransferListWidget::getHashFromRow(int row) const { + return listModel->data(listModel->index(row, HASH)).toString(); +} + +void TransferListWidget::torrentDoubleClicked(QModelIndex index) { + int row = proxyModel->mapToSource(index).row(); + QString hash = getHashFromRow(row); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(!h.is_valid()) return; + int action; + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + if(h.is_seed()) { + action = settings.value(QString::fromUtf8("Preferences/Downloads/DblClOnTorFN"), 0).toInt(); + } else { + action = settings.value(QString::fromUtf8("Preferences/Downloads/DblClOnTorDl"), 0).toInt(); + } + + switch(action) { + case TOGGLE_PAUSE: + if(h.is_paused()) { + h.resume(); + resumeTorrent(row); + } else { + h.pause(); + pauseTorrent(row); + } + break; + case OPEN_DEST: + QDesktopServices::openUrl(QUrl(h.save_path())); + break; + } +} + +void TransferListWidget::startSelectedTorrents() { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + foreach(const QModelIndex &index, selectedIndexes) { + // Get the file hash + QString hash = getHashFromRow(index.row()); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(h.is_valid() && h.is_paused()) { + h.resume(); + resumeTorrent(index.row()); + } + } +} + +void TransferListWidget::startAllTorrents() { + for(int i=0; irowCount(); ++i) { + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(i)); + if(h.is_valid() && h.is_paused()) { + h.resume(); + resumeTorrent(i); + } + } +} + +void TransferListWidget::pauseSelectedTorrents() { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + foreach(const QModelIndex &index, selectedIndexes) { + // Get the file hash + QString hash = getHashFromRow(index.row()); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(h.is_valid() && !h.is_paused()) { + h.pause(); + qDebug("row: %d", index.row()); + pauseTorrent(index.row()); + } + } +} + +void TransferListWidget::pauseAllTorrents() { + for(int i=0; irowCount(); ++i) { + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(i)); + if(h.is_valid() && !h.is_paused()) { + h.pause(); + pauseTorrent(i); + } + } +} + +void TransferListWidget::deleteSelectedTorrents() { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + if(!selectedIndexes.empty()) { + int ret = QMessageBox::question( + this, + tr("Deletion confirmation"), + tr("Are you sure you want to delete the selected torrents from transfer list?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1); + if(ret) return; + foreach(const QModelIndex &index, selectedIndexes) { + // Get the file hash + QString hash = getHashFromRow(index.row()); + deleteTorrent(index.row()); + BTSession->deleteTorrent(hash, false); + } + } +} + +void TransferListWidget::deletePermSelectedTorrents() { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + if(!selectedIndexes.empty()) { + int ret = QMessageBox::question( + this, + tr("Deletion confirmation"), + tr("Are you sure you want to delete the selected torrents from transfe list and hard disk?"), + tr("&Yes"), tr("&No"), + QString(), 0, 1); + if(ret) return; + foreach(const QModelIndex &index, selectedIndexes) { + // Get the file hash + QString hash = getHashFromRow(index.row()); + deleteTorrent(index.row()); + BTSession->deleteTorrent(hash, true); + } + } +} + +// FIXME: Should work only if the tab is displayed +void TransferListWidget::increasePrioSelectedTorrents() { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + foreach(const QModelIndex &index, selectedIndexes) { + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); + if(h.is_valid() && !h.is_seed()) { + BTSession->increaseDlTorrentPriority(h.hash()); + updateTorrent(index.row()); + } + } +} + +// FIXME: Should work only if the tab is displayed +void TransferListWidget::decreasePrioSelectedTorrents() { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + foreach(const QModelIndex &index, selectedIndexes) { + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); + if(h.is_valid() && !h.is_seed()) { + BTSession->decreaseDlTorrentPriority(h.hash()); + updateTorrent(index.row()); + } + } +} + +// FIXME: Use this function +void TransferListWidget::buySelectedTorrents() const { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + foreach(const QModelIndex &index, selectedIndexes) { + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); + if(h.is_valid()) + QDesktopServices::openUrl("http://match.sharemonkey.com/?info_hash="+h.hash()+"&n="+h.name()+"&cid=33"); + } +} + +//FIXME: Use this function +void TransferListWidget::copySelectedMagnetURIs() const { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + QStringList magnet_uris; + foreach(const QModelIndex &index, selectedIndexes) { + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); + if(h.is_valid()) + magnet_uris << misc::toQString(make_magnet_uri(h.get_torrent_info())); + } + qApp->clipboard()->setText(magnet_uris.join("\n")); +} + +void TransferListWidget::hidePriorityColumn(bool hide) { + setColumnHidden(PRIORITY, hide); +} + +// FIXME: Use it +void TransferListWidget::openSelectedTorrentsFolder() const { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + QStringList pathsList; + foreach(const QModelIndex &index, selectedIndexes) { + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); + if(h.is_valid()) { + QString savePath = h.save_path(); + if(!pathsList.contains(savePath)) { + pathsList.append(savePath); + QDesktopServices::openUrl(QUrl(QString("file://")+savePath)); + } + } + } +} + +// FIXME: Use it +void TransferListWidget::previewSelectedTorrents() { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + QStringList pathsList; + foreach(const QModelIndex &index, selectedIndexes) { + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); + if(h.is_valid()) { + new previewSelect(this, h); + } + } +} + +// save the hidden columns in settings +void TransferListWidget::saveHiddenColumns() { + QSettings settings("qBittorrent", "qBittorrent"); + QStringList ishidden_list; + short nbColumns = listModel->columnCount()-1; + + for(short i=0; icolumnCount()-1) { + for(unsigned int i=0; iisQueueingEnabled()) { + lastCol = PRIORITY; + } else { + lastCol = ETA; + } + QList actions; + for(int i=0; i <= lastCol; ++i) { + QIcon icon; + if(isColumnHidden(i)) + icon = QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png")); + else + icon = QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png")); + actions.append(hideshowColumn.addAction(icon, listModel->headerData(i, Qt::Horizontal).toString())); + } + // Call menu + QAction *act = hideshowColumn.exec(QCursor::pos()); + int col = actions.indexOf(act); + setColumnHidden(col, !isColumnHidden(col)); +} diff --git a/src/TransferListWidget.h b/src/TransferListWidget.h new file mode 100644 index 000000000..5f463ac36 --- /dev/null +++ b/src/TransferListWidget.h @@ -0,0 +1,95 @@ +/* + * 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 TRANSFERLISTWIDGET_H +#define TRANSFERLISTWIDGET_H + +#include +#include "qtorrenthandle.h" + +class TransferListDelegate; +class QStandardItemModel; +class QSortFilterProxyModel; +class bittorrent; +class QBasicTimer; + +class TransferListWidget: public QTreeView { + Q_OBJECT + +private: + TransferListDelegate *listDelegate; + QStandardItemModel *listModel; + QSortFilterProxyModel *proxyModel; + bittorrent* BTSession; + QBasicTimer *refreshTimer; + +public: + TransferListWidget(QWidget *parent, bittorrent* BTSession); + ~TransferListWidget(); + +protected: + void timerEvent(QTimerEvent*); + int getRowFromHash(QString hash) const; + QString getHashFromRow(int row) const; + +protected slots: + void updateTorrent(int row); + void deleteTorrent(int row); + void pauseTorrent(int row); + void resumeTorrent(int row); + void torrentDoubleClicked(QModelIndex index); + bool loadHiddenColumns(); + void saveHiddenColumns(); + //void setRowColor(int row, QColor color); + +public slots: + void refreshList(); + void addTorrent(QTorrentHandle& h); + void setFinished(QTorrentHandle &h); + void setRefreshInterval(int t); + void startSelectedTorrents(); + void startAllTorrents(); + void pauseSelectedTorrents(); + void pauseAllTorrents(); + void pauseTorrent(QString hash); + void deleteSelectedTorrents(); + void deletePermSelectedTorrents(); + void increasePrioSelectedTorrents(); + void decreasePrioSelectedTorrents(); + void buySelectedTorrents() const; + void copySelectedMagnetURIs() const; + void openSelectedTorrentsFolder() const; + void previewSelectedTorrents(); + void hidePriorityColumn(bool hide); + void displayDLHoSMenu(const QPoint&); + +}; + +#endif // TRANSFERLISTWIDGET_H diff --git a/src/bittorrent.cpp b/src/bittorrent.cpp index 281de1b89..c241b0ebf 100644 --- a/src/bittorrent.cpp +++ b/src/bittorrent.cpp @@ -243,32 +243,15 @@ QTorrentHandle bittorrent::getTorrentHandle(QString hash) const{ return QTorrentHandle(s->find_torrent(misc::fromString((hash.toStdString())))); } -unsigned int bittorrent::getFinishedPausedTorrentsNb() const { - unsigned int nbPaused = 0; +bool bittorrent::hasActiveTorrents() const { std::vector torrents = getTorrents(); std::vector::iterator torrentIT; for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { QTorrentHandle h = QTorrentHandle(*torrentIT); - if(!h.is_valid()) continue; - if(h.is_seed() && h.is_paused()) { - ++nbPaused; - } - } - return nbPaused; -} - -unsigned int bittorrent::getUnfinishedPausedTorrentsNb() const { - unsigned int nbPaused = 0; - std::vector torrents = getTorrents(); - std::vector::iterator torrentIT; - for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { - QTorrentHandle h = QTorrentHandle(*torrentIT); - if(!h.is_valid()) continue; - if(!h.is_seed() && h.is_paused()) { - ++nbPaused; - } + if(h.is_valid() && !h.is_paused() && !h.is_queued()) + return true; } - return nbPaused; + return false; } // Delete a torrent from the session, given its hash diff --git a/src/bittorrent.h b/src/bittorrent.h index 7e753adf7..6aaab3254 100644 --- a/src/bittorrent.h +++ b/src/bittorrent.h @@ -97,8 +97,7 @@ class bittorrent : public QObject { session* getSession() const; QHash getTrackersErrors(QString hash) const; bool has_filtered_files(QString hash) const; - unsigned int getFinishedPausedTorrentsNb() const; - unsigned int getUnfinishedPausedTorrentsNb() const; + bool hasActiveTorrents() const; bool isQueueingEnabled() const; int getDlTorrentPriority(QString hash) const; int getUpTorrentPriority(QString hash) const; diff --git a/src/downloadingTorrents.cpp b/src/downloadingTorrents.cpp index 697b2c393..c824f7633 100644 --- a/src/downloadingTorrents.cpp +++ b/src/downloadingTorrents.cpp @@ -380,14 +380,6 @@ void DownloadingTorrents::hideOrShowColumn(int index) { } } -void DownloadingTorrents::hidePriorityColumn(bool hide) { - downloadList->setColumnHidden(PRIORITY, hide); - if(hide) - getActionHoSCol(PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); - else - getActionHoSCol(PRIORITY)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); -} - // save the hidden columns in settings void DownloadingTorrents::saveHiddenColumns() { QSettings settings("qBittorrent", "qBittorrent"); @@ -778,3 +770,5 @@ int DownloadingTorrents::getRowFromHash(QString hash) const{ } return -1; } + + diff --git a/src/downloadingTorrents.h b/src/downloadingTorrents.h index 0004ee408..7acaa9ac3 100644 --- a/src/downloadingTorrents.h +++ b/src/downloadingTorrents.h @@ -97,7 +97,6 @@ class DownloadingTorrents : public QWidget, public Ui::downloading{ void propertiesSelection(); void updateFileSizeAndProgress(QString hash); void showPropertiesFromHash(QString hash); - void hidePriorityColumn(bool hide); void saveLastSortedColumn(); void loadLastSortedColumn(); void addTorrent(QString hash); diff --git a/src/src.pro b/src/src.pro index 115cc1b1b..f6ba38b57 100644 --- a/src/src.pro +++ b/src/src.pro @@ -185,7 +185,9 @@ HEADERS += GUI.h \ torrentPersistentData.h \ FeedDownloader.h \ feedList.h \ - supportedEngines.h + supportedEngines.h \ + TransferListWidget.h \ + TransferListDelegate.h FORMS += MainWindow.ui \ options.ui \ about.ui \ @@ -228,5 +230,6 @@ SOURCES += GUI.cpp \ eventmanager.cpp \ SearchTab.cpp \ ico.cpp \ - rss.cpp + rss.cpp \ + TransferListWidget.cpp DESTDIR = . From bf7841cdb9b4422d782f76ac99f421e4438e90f4 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sat, 7 Nov 2009 20:00:38 +0000 Subject: [PATCH 03/34] - Improved list refreshing code --- src/TransferListWidget.cpp | 15 +++++---------- src/TransferListWidget.h | 5 ++--- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index 34f516436..458400773 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include #include @@ -89,8 +89,9 @@ TransferListWidget::TransferListWidget(QWidget *parent, bittorrent *_BTSession): connect(header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayDLHoSMenu(const QPoint&))); // Refresh timer - refreshTimer = new QBasicTimer(); - refreshTimer->start(settings.value("Preferences/General/RefreshInterval", 1500).toInt(), this); + refreshTimer = new QTimer(); + refreshTimer->start(settings.value("Preferences/General/RefreshInterval", 1500).toInt()); + connect(refreshTimer, SIGNAL(timeout()), this, SLOT(refreshList())); } TransferListWidget::~TransferListWidget() { @@ -101,10 +102,6 @@ TransferListWidget::~TransferListWidget() { delete listDelegate; } -void TransferListWidget::timerEvent(QTimerEvent*) { - refreshList(); -} - void TransferListWidget::addTorrent(QTorrentHandle& h) { if(!h.is_valid()) return; int row = listModel->rowCount(); @@ -146,7 +143,6 @@ void TransferListWidget::pauseTorrent(QString hash) { } void TransferListWidget::pauseTorrent(int row) { - qDebug("Torrent visibly paused"); listModel->setData(listModel->index(row, DLSPEED), QVariant((double)0.0)); listModel->setData(listModel->index(row, UPSPEED), QVariant((double)0.0)); listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); @@ -263,7 +259,7 @@ void TransferListWidget::setFinished(QTorrentHandle &h) { } void TransferListWidget::setRefreshInterval(int t) { - refreshTimer->start(t, this); + refreshTimer->start(t); } void TransferListWidget::refreshList() { @@ -343,7 +339,6 @@ void TransferListWidget::pauseSelectedTorrents() { QTorrentHandle h = BTSession->getTorrentHandle(hash); if(h.is_valid() && !h.is_paused()) { h.pause(); - qDebug("row: %d", index.row()); pauseTorrent(index.row()); } } diff --git a/src/TransferListWidget.h b/src/TransferListWidget.h index 5f463ac36..4fa25d882 100644 --- a/src/TransferListWidget.h +++ b/src/TransferListWidget.h @@ -38,7 +38,7 @@ class TransferListDelegate; class QStandardItemModel; class QSortFilterProxyModel; class bittorrent; -class QBasicTimer; +class QTimer; class TransferListWidget: public QTreeView { Q_OBJECT @@ -48,14 +48,13 @@ private: QStandardItemModel *listModel; QSortFilterProxyModel *proxyModel; bittorrent* BTSession; - QBasicTimer *refreshTimer; + QTimer *refreshTimer; public: TransferListWidget(QWidget *parent, bittorrent* BTSession); ~TransferListWidget(); protected: - void timerEvent(QTimerEvent*); int getRowFromHash(QString hash) const; QString getHashFromRow(int row) const; From 23d1aa7691ec73ee2f53266ff97b901f182f7946 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sat, 7 Nov 2009 21:04:56 +0000 Subject: [PATCH 04/34] - Started to put back the right click menu (still unperfect) --- src/TransferListWidget.cpp | 128 +++++++++++++++++++++++++++++++++++-- src/TransferListWidget.h | 4 ++ 2 files changed, 128 insertions(+), 4 deletions(-) diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index 458400773..9aacdb8ec 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -33,6 +33,7 @@ #include "bittorrent.h" #include "torrentPersistentData.h" #include "previewSelect.h" +#include "allocationDlg.h" #include "options_imp.h" #include #include @@ -86,6 +87,7 @@ TransferListWidget::TransferListWidget(QWidget *parent, bittorrent *_BTSession): // Listen for list events connect(this, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(torrentDoubleClicked(QModelIndex))); + connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayListMenu(const QPoint&))); connect(header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayDLHoSMenu(const QPoint&))); // Refresh timer @@ -416,7 +418,6 @@ void TransferListWidget::decreasePrioSelectedTorrents() { } } -// FIXME: Use this function void TransferListWidget::buySelectedTorrents() const { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); foreach(const QModelIndex &index, selectedIndexes) { @@ -426,7 +427,6 @@ void TransferListWidget::buySelectedTorrents() const { } } -//FIXME: Use this function void TransferListWidget::copySelectedMagnetURIs() const { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); QStringList magnet_uris; @@ -442,7 +442,6 @@ void TransferListWidget::hidePriorityColumn(bool hide) { setColumnHidden(PRIORITY, hide); } -// FIXME: Use it void TransferListWidget::openSelectedTorrentsFolder() const { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); QStringList pathsList; @@ -458,7 +457,6 @@ void TransferListWidget::openSelectedTorrentsFolder() const { } } -// FIXME: Use it void TransferListWidget::previewSelectedTorrents() { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); QStringList pathsList; @@ -470,6 +468,41 @@ void TransferListWidget::previewSelectedTorrents() { } } +void TransferListWidget::setDlLimitSelectedTorrents() { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + QStringList hashes; + foreach(const QModelIndex &index, selectedIndexes) { + // Get the file hash + QString hash = getHashFromRow(index.row()); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(h.is_valid() && !h.is_seed()) + hashes << hash; + } + Q_ASSERT(hashes.size() > 0); + new BandwidthAllocationDialog(this, false, BTSession, hashes); +} + +void TransferListWidget::setUpLimitSelectedTorrents() { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + QStringList hashes; + foreach(const QModelIndex &index, selectedIndexes) { + // Get the file hash + hashes << getHashFromRow(index.row()); + } + Q_ASSERT(hashes.size() > 0); + new BandwidthAllocationDialog(this, true, BTSession, hashes); +} + +void TransferListWidget::recheckSelectedTorrents() { + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + foreach(const QModelIndex &index, selectedIndexes){ + QString hash = getHashFromRow(index.row()); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + if(h.is_valid() && h.has_metadata()) + h.force_recheck(); + } +} + // save the hidden columns in settings void TransferListWidget::saveHiddenColumns() { QSettings settings("qBittorrent", "qBittorrent"); @@ -530,3 +563,90 @@ void TransferListWidget::displayDLHoSMenu(const QPoint&){ int col = actions.indexOf(act); setColumnHidden(col, !isColumnHidden(col)); } + +// FIXME: Not everything should be displayed for seeding torrents +void TransferListWidget::displayListMenu(const QPoint&) { + // Create actions + QAction actionStart(QIcon(QString::fromUtf8(":/Icons/skin/play.png")), tr("Start"), 0); + connect(&actionStart, SIGNAL(triggered()), this, SLOT(startSelectedTorrents())); + QAction actionPause(QIcon(QString::fromUtf8(":/Icons/skin/pause.png")), tr("Pause"), 0); + connect(&actionPause, SIGNAL(triggered()), this, SLOT(pauseSelectedTorrents())); + QAction actionDelete(QIcon(QString::fromUtf8(":/Icons/skin/delete.png")), tr("Delete"), 0); + connect(&actionDelete, SIGNAL(triggered()), this, SLOT(deleteSelectedTorrents())); + QAction actionPreview_file(QIcon(QString::fromUtf8(":/Icons/skin/preview.png")), tr("Preview file"), 0); + connect(&actionPreview_file, SIGNAL(triggered()), this, SLOT(previewSelectedTorrents())); + QAction actionSet_upload_limit(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png")), tr("Set upload limit"), 0); + connect(&actionSet_upload_limit, SIGNAL(triggered()), this, SLOT(setUpLimitSelectedTorrents())); + QAction actionSet_download_limit(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png")), tr("Set download limit"), 0); + connect(&actionSet_download_limit, SIGNAL(triggered()), this, SLOT(setDlLimitSelectedTorrents())); + QAction actionDelete_Permanently(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png")), tr("Delete Permanently"), 0); + connect(&actionDelete_Permanently, SIGNAL(triggered()), this, SLOT(deletePermSelectedTorrents())); + QAction actionOpen_destination_folder(QIcon(QString::fromUtf8(":/Icons/oxygen/folder.png")), tr("Open destination folder"), 0); + connect(&actionOpen_destination_folder, SIGNAL(triggered()), this, SLOT(openSelectedTorrentsFolder())); + QAction actionBuy_it(QIcon(QString::fromUtf8(":/Icons/oxygen/wallet.png")), tr("Buy it"), 0); + connect(&actionBuy_it, SIGNAL(triggered()), this, SLOT(buySelectedTorrents())); + QAction actionIncreasePriority(QIcon(QString::fromUtf8(":/Icons/skin/increase.png")), tr("Increase priority"), 0); + connect(&actionIncreasePriority, SIGNAL(triggered()), this, SLOT(increasePrioSelectedTorrents())); + QAction actionDecreasePriority(QIcon(QString::fromUtf8(":/Icons/skin/decrease.png")), tr("Decrease priority"), 0); + connect(&actionDecreasePriority, SIGNAL(triggered()), this, SLOT(decreasePrioSelectedTorrents())); + QAction actionForce_recheck(QIcon(QString::fromUtf8(":/Icons/oxygen/gear.png")), tr("Force recheck"), 0); + connect(&actionForce_recheck, SIGNAL(triggered()), this, SLOT(recheckSelectedTorrents())); + QAction actionCopy_magnet_link(QIcon(QString::fromUtf8(":/Icons/magnet.png")), tr("Copy magnet link"), 0); + connect(&actionCopy_magnet_link, SIGNAL(triggered()), this, SLOT(copySelectedMagnetURIs())); + // End of actions + QMenu listMenu(this); + // Enable/disable pause/start action given the DL state + QModelIndexList selectedIndexes = selectionModel()->selectedRows(); + 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) { + // Get the file name + QString hash = getHashFromRow(index.row()); + // Get handle and pause the torrent + h = BTSession->getTorrentHandle(hash); + if(!h.is_valid()) continue; + if(h.has_metadata()) { + one_has_metadata = true; + } + if(h.is_paused()) { + if(!has_start) { + listMenu.addAction(&actionStart); + has_start = true; + } + }else{ + if(!has_pause) { + listMenu.addAction(&actionPause); + has_pause = true; + } + } + if(h.has_metadata() && BTSession->isFilePreviewPossible(hash) && !has_preview) { + listMenu.addAction(&actionPreview_file); + has_preview = true; + } + if(has_pause && has_start && has_preview) break; + } + listMenu.addSeparator(); + listMenu.addAction(&actionDelete); + listMenu.addAction(&actionDelete_Permanently); + listMenu.addSeparator(); + listMenu.addAction(&actionSet_download_limit); + listMenu.addAction(&actionSet_upload_limit); + listMenu.addSeparator(); + if(one_has_metadata) { + listMenu.addAction(&actionForce_recheck); + listMenu.addSeparator(); + } + listMenu.addAction(&actionOpen_destination_folder); + if(BTSession->isQueueingEnabled()) { + listMenu.addSeparator(); + listMenu.addAction(&actionIncreasePriority); + listMenu.addAction(&actionDecreasePriority); + } + listMenu.addSeparator(); + listMenu.addAction(&actionCopy_magnet_link); + listMenu.addAction(&actionBuy_it); + // Call menu + listMenu.exec(QCursor::pos()); +} diff --git a/src/TransferListWidget.h b/src/TransferListWidget.h index 4fa25d882..c081a8961 100644 --- a/src/TransferListWidget.h +++ b/src/TransferListWidget.h @@ -66,6 +66,7 @@ protected slots: void torrentDoubleClicked(QModelIndex index); bool loadHiddenColumns(); void saveHiddenColumns(); + void displayListMenu(const QPoint&); //void setRowColor(int row, QColor color); public slots: @@ -85,6 +86,9 @@ public slots: void buySelectedTorrents() const; void copySelectedMagnetURIs() const; void openSelectedTorrentsFolder() const; + void recheckSelectedTorrents(); + void setDlLimitSelectedTorrents(); + void setUpLimitSelectedTorrents(); void previewSelectedTorrents(); void hidePriorityColumn(bool hide); void displayDLHoSMenu(const QPoint&); From c818c2dae6a5d8f27f96b98d39482c1b62025478 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 08:38:07 +0000 Subject: [PATCH 05/34] - Updated Transfer tab icon - Fix display of priority for seeding torrents --- src/GUI.cpp | 2 +- src/Icons/oxygen/folder-remote.png | Bin 0 -> 2393 bytes src/TransferListDelegate.h | 6 +++++- src/icons.qrc | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 src/Icons/oxygen/folder-remote.png diff --git a/src/GUI.cpp b/src/GUI.cpp index c23a89462..8ce15deb8 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -138,7 +138,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis // Transfer List tab transferList = new TransferListWidget(tabs, BTSession); int index_tab = tabs->addTab(transferList, tr("Transfers")); - tabs->setTabIcon(index_tab, QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))); + tabs->setTabIcon(index_tab, QIcon(QString::fromUtf8(":/Icons/oxygen/folder-remote.png"))); vboxLayout->addWidget(tabs); // Transfer list slots diff --git a/src/Icons/oxygen/folder-remote.png b/src/Icons/oxygen/folder-remote.png new file mode 100644 index 0000000000000000000000000000000000000000..6210201b7d87744ca585dad05fd159e1ffc5eff9 GIT binary patch literal 2393 zcmV-f38wamP)y{D4^00_%TL_t(|+P#-sj3iYV$N%3sr>eWU zrsqDrGrM!!U6$*z5Cq|Y2NWU-`amKQ4U(8BhKL&D1MvxsQKJbVF-BiV%zDER5E6;R zm3YZ=k=^CKEIZ50?#%4;+^6qV-E}+1uc{$3hQ-as_;tQi_o?pl|JDEdSErkvIJyNv zz;X?A#ZDLlKnmcsMIcI$EsPI>POiXMvisT(fgj#Eg#Sg+^p`7`e?%ay&;3mI+7=Xx znCv8hVhuBQ7WGH&i_Py|5NJnalmN_yh;eHJY}N@<0zv@v^Jlk&0dyzA9V12jN(uxF zKO-P4Io=lVT>tq2c&eh}wdv#Sf3S+$U8WcB8f!qkw40YC>2Z%P7^ zdIt}diuf*om|MM%S~IoS^60 z8*F!&Qb5*9)f z{G{X3_nugMeZaMPgGl$s+Vm5h|J7Xx06$0ys^u(Et9nsWy;Y8PkkCdFloa^CRHDJ7 zN8V`dD5b21rG!g>7WD7onh%+U>6-Z;CkS-T*=!GvG|&dnQLH_cv#gGivIrOung5<- zE|HSbyKPby4Wr+U2hn*1A$lXR4ASv~`Zbea3ZJ_V^15)guR03C+VaSR~^lx@Ru z@>#r-D2CP=^r0YRxCNJ=0(d-p%Hj$0fx_8lQlY-S1*)!M&1^f2)qr4hm zvE0DgmX}!{hY{?c1!`E80wPCccK*owYrbI zqcA+ykIH%-i)S~{*XQD@Yo>AJ@G*wTW9qU!2!n82CRiLY1t7HeE}&*clL92&6dNY7 z@;RJ&m%aq@+nT(A5B?nyk$L z>;ON3#jVm7fa6%$oG+ufRm-R*CI`V*!3z>}VvULMeoT%J;N??ms01252NAOv*IhA8A9xizc!VT9hn0)|Wd@I4>R%?k2)1xpZEBhyMX zS-a~1w@GbL5*Zy#jL7q{g+tHJW3|#ovmN2>`3f4G>bd1Qnn8pc4vgWFy+aIOLGqkM zo{ub)>v6DatPdl@E&_&Z*PA?6k&fa0BQV??Le2mLX{|}TmsCjxd0U{?3ZV;mtWqYoiIpZaRFPSu^`dWI3Z0fD8lJ3Z5p0j7cEX*9NvNjhlX{Fo+R?R;z7O+!52S z56@%&z7cGM8l{mQZ2A${BiK^FaED2Pf@{N7!1FK8LbaM^n5`cf9e{xDj+aZa1C~N8 zQUGNOzt$ns3=_%P0MkSPFfg@?Ok#{<2_x9ETnc4b^w)PPxc}CRG0L~ynQ9v^E!Hu= z-h{`_2&J%hS01x7t0ru>N&6vs#>S8v8l;-90gy>0L;^{?Z-3sj)saJgs1>HK^Mgc4 zz=Qw@M92>)43GB8WuAF&PabDhTXe<#G1FJFXv! zw||yZ67&{CaeR<&xMtkkbj29;aqt?EMk7dIIO#j;^ZKg`B*r;wi=KKCL092O{u<}I_bq=-1_uR4;OZr+{%DCMM z#0xW1Q9r+RF#O(fZ7{tgs;NrBYGH zZceY%I&h^ysYha|5n*nl1xr4j^(Kr4BQjX&*?RD1&J!G!tI+ky}c{NsMCy3%r>2#LX!0K0B#S~A3w-@J%tade*pojK7}ZF za{d4S03v!+SaefwW^{L9a%BJjc-kv3FW1Y=%Pvk%EJ)SMFG>dhHrNJO5L3!r00000 LNkvXXu0mjfTsLRQ literal 0 HcmV?d00001 diff --git a/src/TransferListDelegate.h b/src/TransferListDelegate.h index e8de0ee36..4f9810f23 100644 --- a/src/TransferListDelegate.h +++ b/src/TransferListDelegate.h @@ -88,8 +88,12 @@ public: } case PRIORITY: { int priority = index.data().toInt(); - if(priority >= 0) + if(priority >= 0) { QItemDelegate::paint(painter, option, index); + } else { + QItemDelegate::drawBackground(painter, opt, index); + QItemDelegate::drawDisplay(painter, opt, opt.rect, "*"); + } break; } case PROGRESS:{ diff --git a/src/icons.qrc b/src/icons.qrc index 4f9f4278c..a6fe310d7 100644 --- a/src/icons.qrc +++ b/src/icons.qrc @@ -74,6 +74,7 @@ Icons/oxygen/time.png Icons/oxygen/edit-find.png Icons/oxygen/folder-new.png + Icons/oxygen/folder-remote.png Icons/oxygen/edit-paste.png Icons/oxygen/proxy.png Icons/oxygen/log.png From 31eb902494e9148fa5e9826eebad0b1a44f91371 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 08:56:20 +0000 Subject: [PATCH 06/34] - Should right click menu behavior for seeding torrents --- src/TransferListWidget.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index 9aacdb8ec..950940921 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -598,7 +598,7 @@ void TransferListWidget::displayListMenu(const QPoint&) { // Enable/disable pause/start action given the DL state QModelIndexList selectedIndexes = selectionModel()->selectedRows(); bool has_pause = false, has_start = false, has_preview = false; - bool one_has_metadata = false; + bool one_has_metadata = false, one_not_seed = false; QTorrentHandle h; qDebug("Displaying menu"); foreach(const QModelIndex &index, selectedIndexes) { @@ -607,9 +607,10 @@ void TransferListWidget::displayListMenu(const QPoint&) { // Get handle and pause the torrent h = BTSession->getTorrentHandle(hash); if(!h.is_valid()) continue; - if(h.has_metadata()) { + if(h.has_metadata()) one_has_metadata = true; - } + if(!h.is_seed()) + one_not_seed = true; if(h.is_paused()) { if(!has_start) { listMenu.addAction(&actionStart); @@ -625,13 +626,14 @@ void TransferListWidget::displayListMenu(const QPoint&) { listMenu.addAction(&actionPreview_file); has_preview = true; } - if(has_pause && has_start && has_preview) break; + if(has_pause && has_start && has_preview && one_not_seed) break; } listMenu.addSeparator(); listMenu.addAction(&actionDelete); listMenu.addAction(&actionDelete_Permanently); listMenu.addSeparator(); - listMenu.addAction(&actionSet_download_limit); + if(one_not_seed) + listMenu.addAction(&actionSet_download_limit); listMenu.addAction(&actionSet_upload_limit); listMenu.addSeparator(); if(one_has_metadata) { @@ -639,7 +641,7 @@ void TransferListWidget::displayListMenu(const QPoint&) { listMenu.addSeparator(); } listMenu.addAction(&actionOpen_destination_folder); - if(BTSession->isQueueingEnabled()) { + if(BTSession->isQueueingEnabled() && one_not_seed) { listMenu.addSeparator(); listMenu.addAction(&actionIncreasePriority); listMenu.addAction(&actionDecreasePriority); From e6465d784d8991043a20087dded964b2e20117cb Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 09:14:54 +0000 Subject: [PATCH 07/34] - Save restore columns state in transfer list --- src/TransferListWidget.cpp | 108 ++++++++++++++++++++++++++++++++++++- src/TransferListWidget.h | 4 ++ 2 files changed, 111 insertions(+), 1 deletion(-) diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index 950940921..b3123de46 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -79,6 +79,11 @@ TransferListWidget::TransferListWidget(QWidget *parent, bittorrent *_BTSession): hideColumn(PRIORITY); hideColumn(HASH); loadHiddenColumns(); + // Load last columns width for transfer list + if(!loadColWidthList()) { + header()->resizeSection(0, 200); + } + loadLastSortedColumn(); setContextMenuPolicy(Qt::CustomContextMenu); // Listen for BTSession events @@ -97,7 +102,11 @@ TransferListWidget::TransferListWidget(QWidget *parent, bittorrent *_BTSession): } TransferListWidget::~TransferListWidget() { + // Save settings + saveLastSortedColumn(); + saveColWidthList(); saveHiddenColumns(); + // Clean up delete refreshTimer; delete proxyModel; delete listModel; @@ -564,7 +573,6 @@ void TransferListWidget::displayDLHoSMenu(const QPoint&){ setColumnHidden(col, !isColumnHidden(col)); } -// FIXME: Not everything should be displayed for seeding torrents void TransferListWidget::displayListMenu(const QPoint&) { // Create actions QAction actionStart(QIcon(QString::fromUtf8(":/Icons/skin/play.png")), tr("Start"), 0); @@ -652,3 +660,101 @@ void TransferListWidget::displayListMenu(const QPoint&) { // Call menu listMenu.exec(QCursor::pos()); } + +// Save columns width in a file to remember them +void TransferListWidget::saveColWidthList() { + qDebug("Saving columns width in transfer list"); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + QStringList width_list; + QStringList new_width_list; + short nbColumns = listModel->columnCount()-1; + QString line = settings.value("TransferListColsWidth", QString()).toString(); + if(!line.isEmpty()) { + width_list = line.split(' '); + } + for(short i=0; i=1) { + // load the former width + new_width_list << width_list.at(i); + } else if(columnWidth(i)>=1) { + // usual case, save the current width + new_width_list << misc::toQString(columnWidth(i)); + } else { + // default width + resizeColumnToContents(i); + new_width_list << misc::toQString(columnWidth(i)); + } + } + settings.setValue(QString::fromUtf8("TransferListColsWidth"), new_width_list.join(QString::fromUtf8(" "))); + QVariantList visualIndexes; + for(int i=0; ivisualIndex(i)); + } + settings.setValue(QString::fromUtf8("TransferListVisualIndexes"), visualIndexes); + qDebug("Download list columns width saved"); +} + +// Load columns width in a file that were saved previously +bool TransferListWidget::loadColWidthList() { + qDebug("Loading columns width for download list"); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + QString line = settings.value(QString::fromUtf8("TransferListColsWidth"), QString()).toString(); + if(line.isEmpty()) + return false; + QStringList width_list = line.split(QString::fromUtf8(" ")); + if(width_list.size() != listModel->columnCount()-1) { + qDebug("Corrupted values for download list columns sizes"); + return false; + } + unsigned int listSize = width_list.size(); + for(unsigned int i=0; iresizeSection(i, width_list.at(i).toInt()); + } + QVariantList visualIndexes = settings.value(QString::fromUtf8("TransferListVisualIndexes"), QVariantList()).toList(); + if(visualIndexes.size() != listModel->columnCount()-1) { + qDebug("Corrupted values for download list columns sizes"); + return false; + } + bool change = false; + do { + change = false; + for(int i=0;ilogicalIndex(i)).toInt(); + if(i != new_visual_index) { + qDebug("Moving column from %d to %d", header()->logicalIndex(i), new_visual_index); + header()->moveSection(i, new_visual_index); + change = true; + } + } + }while(change); + qDebug("Transfer list columns width loaded"); + return true; +} + +void TransferListWidget::saveLastSortedColumn() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + Qt::SortOrder sortOrder = header()->sortIndicatorOrder(); + QString sortOrderLetter; + if(sortOrder == Qt::AscendingOrder) + sortOrderLetter = QString::fromUtf8("a"); + else + sortOrderLetter = QString::fromUtf8("d"); + int index = header()->sortIndicatorSection(); + settings.setValue(QString::fromUtf8("TransferListSortedCol"), misc::toQString(index)+sortOrderLetter); +} + +void TransferListWidget::loadLastSortedColumn() { + // Loading last sorted column + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + QString sortedCol = settings.value(QString::fromUtf8("TransferListSortedCol"), QString()).toString(); + if(!sortedCol.isEmpty()) { + Qt::SortOrder sortOrder; + if(sortedCol.endsWith(QString::fromUtf8("d"))) + sortOrder = Qt::DescendingOrder; + else + sortOrder = Qt::AscendingOrder; + sortedCol = sortedCol.left(sortedCol.size()-1); + int index = sortedCol.toInt(); + sortByColumn(index, sortOrder); + } +} diff --git a/src/TransferListWidget.h b/src/TransferListWidget.h index c081a8961..3b8c1e45a 100644 --- a/src/TransferListWidget.h +++ b/src/TransferListWidget.h @@ -57,6 +57,10 @@ public: protected: int getRowFromHash(QString hash) const; QString getHashFromRow(int row) const; + void saveColWidthList(); + bool loadColWidthList(); + void saveLastSortedColumn(); + void loadLastSortedColumn(); protected slots: void updateTorrent(int row); From 8d59f3c4e1ceaee341b1337c05cd65de806018a5 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 09:24:56 +0000 Subject: [PATCH 08/34] - Updated torrent state icons --- src/Icons/oxygen/mail-queue.png | Bin 0 -> 860 bytes src/Icons/oxygen/run-build.png | Bin 0 -> 942 bytes src/TransferListWidget.cpp | 6 +++--- src/icons.qrc | 2 ++ 4 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 src/Icons/oxygen/mail-queue.png create mode 100644 src/Icons/oxygen/run-build.png diff --git a/src/Icons/oxygen/mail-queue.png b/src/Icons/oxygen/mail-queue.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba505d4f7d76695c4defeb5ee41baefae0c6f50 GIT binary patch literal 860 zcmV-i1Ec(jP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXZ7 z7cL&Y=Znq&00P`eL_t(I%YBniXdHDE$3HVWGuhpwYj%^SY1(RbwM{G0D%4`BuwH^F zq9~PAk{l|6XKx~ygF?ZZIe8GIqG(YRJyZg zou7x5H1v;Oc!&3W?|pfX_a58^tu^<;-D1Y=#H(+;XFaexGyUk{k%>e3LP09Qr7M44 z|Lu>!;fr&9pb>MlK*3}MSRMjt<+>$U2I;;G55 zD2|i~5QM=y$B#e7hTAY&Lf{9IK*;UU0;v$9!_^zEaq!4v1k#`W>6`PI0C77yogLVV zFC;;rIt4P^7LZaQq(Z0;pU&hkG^e*mNG8*VT7Ez~iaKjCK!xFs4kS)0g$fl)DMX~m z<@z23Ivqq|h?J^hDkM}9+5pe@0GN66H41yOctJo%z2pQlDA0d2# zz(Z(*_dorbnNPkzO3D3u`!Ud{rb{TqR{+MrCr%Q#Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXV< z0RcEJPsnco00S;bL_t(I%WacSNF#R?fWMh!CR6`J?AA@tv2I(|N}-n?+SN-+5sE$3 zV=0C0snUz39yC%fQYc02q1_%9(vwmaL_`o;&>&Kc)hr0M61FihwXC8xYjl%1$^2#} zzaCs+g?^U@ACJd-y!YT4t*xy@I-NeTEK8P3 zC0Qz!WTjG(*=)A5y}kWQwOWMu(PxCLvL^Im&(Av0I^t%WHPyFn&vx!K!DB7O$@`JqoV^* zI6OQcpU>0N(}Qi>oSd8-ba!{R4-E}nb^wq_B%YY2c_W+6a_iPB037E3L?U^y{xuAv zj$Ce!wzf73g#wXCL;+CN*VjK0LcARghrdu&mGkp+8XKE=nEReP-FMJ5o$Wt1c-iCb60)fD~5|792=H_Ny*L5^a!?p!~?f*u(^(We1dJ9!m`S$bLLI_kL#COGFG441H)oPU&41-t0-Q*s+)NCJROXDD`ObO?Td?x>fGF1*yr;-1t1oS0VpdgEBCHOT3%j$kV>Uw zDwUFJYikKWedZ^l(P-1`?CkZA92pt878e#41~ZwA+}+)k@p$~l|H}dR4@hj27rj8S Q-~a#s07*qoM6N<$f}hQ&s{jB1 literal 0 HcmV?d00001 diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index b3123de46..4462b8a7d 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -186,10 +186,10 @@ void TransferListWidget::updateTorrent(int row) { listModel->setData(listModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash))); if(h.is_queued()) { if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking) { - listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/run-build.png"))), Qt::DecorationRole); listModel->setData(listModel->index(row, PROGRESS), QVariant((double)h.progress())); }else { - listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/mail-queued.png"))), Qt::DecorationRole); listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); } // Reset speeds and seeds/leech @@ -209,7 +209,7 @@ void TransferListWidget::updateTorrent(int row) { case torrent_status::checking_files: case torrent_status::queued_for_checking: case torrent_status::checking_resume_data: - listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/run-build.png"))), Qt::DecorationRole); //setRowColor(row, QString::fromUtf8("grey")); break; case torrent_status::downloading: diff --git a/src/icons.qrc b/src/icons.qrc index a6fe310d7..8f25c7f4f 100644 --- a/src/icons.qrc +++ b/src/icons.qrc @@ -68,6 +68,7 @@ Icons/flags/italy.png Icons/flags/south_korea.png Icons/flags/japan.png + Icons/oxygen/mail-queue.png Icons/oxygen/view-refresh.png Icons/oxygen/file.png Icons/oxygen/mail-folder-inbox.png @@ -76,6 +77,7 @@ Icons/oxygen/folder-new.png Icons/oxygen/folder-remote.png Icons/oxygen/edit-paste.png + Icons/oxygen/run-build.png Icons/oxygen/proxy.png Icons/oxygen/log.png Icons/oxygen/unavailable.png From 33324c190ef0c004cf34631908f33e710fb03236 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 09:28:34 +0000 Subject: [PATCH 09/34] - Update torrent metadata in transfer list once it is received --- src/TransferListWidget.cpp | 11 +++++++++++ src/TransferListWidget.h | 1 + 2 files changed, 12 insertions(+) diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index 4462b8a7d..573f813b0 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -89,6 +89,7 @@ TransferListWidget::TransferListWidget(QWidget *parent, bittorrent *_BTSession): // Listen for BTSession events connect(BTSession, SIGNAL(addedTorrent(QTorrentHandle&)), this, SLOT(addTorrent(QTorrentHandle&))); connect(BTSession, SIGNAL(finishedTorrent(QTorrentHandle&)), this, SLOT(setFinished(QTorrentHandle&))); + connect(BTSession, SIGNAL(metadataReceived(QTorrentHandle&)), this, SLOT(updateMetadata(QTorrentHandle&))); // Listen for list events connect(this, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(torrentDoubleClicked(QModelIndex))); @@ -170,6 +171,16 @@ void TransferListWidget::resumeTorrent(int row) { updateTorrent(row); } +void TransferListWidget::updateMetadata(QTorrentHandle &h) { + QString hash = h.hash(); + int row = getRowFromHash(hash); + if(row != -1) { + qDebug("Updating torrent metadata in download list"); + listModel->setData(listModel->index(row, NAME), QVariant(h.name())); + listModel->setData(listModel->index(row, SIZE), QVariant((qlonglong)h.actual_size())); + } +} + void TransferListWidget::updateTorrent(int row) { QString hash = getHashFromRow(row); QTorrentHandle h = BTSession->getTorrentHandle(hash); diff --git a/src/TransferListWidget.h b/src/TransferListWidget.h index 3b8c1e45a..5d616e09d 100644 --- a/src/TransferListWidget.h +++ b/src/TransferListWidget.h @@ -71,6 +71,7 @@ protected slots: bool loadHiddenColumns(); void saveHiddenColumns(); void displayListMenu(const QPoint&); + void updateMetadata(QTorrentHandle &h); //void setRowColor(int row, QColor color); public slots: From 52638a28910d999bc147a81aed60fa19d5226666 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 09:50:29 +0000 Subject: [PATCH 10/34] - Fix torrent priority update --- src/TransferListWidget.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index 573f813b0..bd18d434b 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -190,7 +190,6 @@ void TransferListWidget::updateTorrent(int row) { return; } try { - if(h.is_paused()) return; if(!h.is_seed()) { // Queueing code if(BTSession->isQueueingEnabled()) { @@ -211,6 +210,7 @@ void TransferListWidget::updateTorrent(int row) { return; } } + if(h.is_paused()) return; // Update listModel->setData(listModel->index(row, PROGRESS), QVariant((double)h.progress())); listModel->setData(listModel->index(row, DLSPEED), QVariant((double)h.download_payload_rate())); @@ -421,9 +421,9 @@ void TransferListWidget::increasePrioSelectedTorrents() { QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); if(h.is_valid() && !h.is_seed()) { BTSession->increaseDlTorrentPriority(h.hash()); - updateTorrent(index.row()); } } + refreshList(); } // FIXME: Should work only if the tab is displayed @@ -433,9 +433,9 @@ void TransferListWidget::decreasePrioSelectedTorrents() { QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); if(h.is_valid() && !h.is_seed()) { BTSession->decreaseDlTorrentPriority(h.hash()); - updateTorrent(index.row()); } } + refreshList(); } void TransferListWidget::buySelectedTorrents() const { From 806eee9404b5d7ef690413f0097b3a19f85ebd05 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 09:53:18 +0000 Subject: [PATCH 11/34] - Fixed queued icon --- src/TransferListWidget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index bd18d434b..85697a08e 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -199,7 +199,7 @@ void TransferListWidget::updateTorrent(int row) { listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/run-build.png"))), Qt::DecorationRole); listModel->setData(listModel->index(row, PROGRESS), QVariant((double)h.progress())); }else { - listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/mail-queued.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/mail-queue.png"))), Qt::DecorationRole); listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); } // Reset speeds and seeds/leech From 7caed10dc025d440f4aabdf8e45ef8a686f41266 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 10:10:07 +0000 Subject: [PATCH 12/34] - Fix a lot of issues related to proxy model --- src/TransferListWidget.cpp | 40 +++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index 85697a08e..2a095b41a 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -334,11 +334,12 @@ void TransferListWidget::startSelectedTorrents() { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); foreach(const QModelIndex &index, selectedIndexes) { // Get the file hash - QString hash = getHashFromRow(index.row()); + int row = proxyModel->mapToSource(index).row(); + QString hash = getHashFromRow(row); QTorrentHandle h = BTSession->getTorrentHandle(hash); if(h.is_valid() && h.is_paused()) { h.resume(); - resumeTorrent(index.row()); + resumeTorrent(row); } } } @@ -357,11 +358,12 @@ void TransferListWidget::pauseSelectedTorrents() { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); foreach(const QModelIndex &index, selectedIndexes) { // Get the file hash - QString hash = getHashFromRow(index.row()); + int row = proxyModel->mapToSource(index).row(); + QString hash = getHashFromRow(row); QTorrentHandle h = BTSession->getTorrentHandle(hash); if(h.is_valid() && !h.is_paused()) { h.pause(); - pauseTorrent(index.row()); + pauseTorrent(row); } } } @@ -388,8 +390,9 @@ void TransferListWidget::deleteSelectedTorrents() { if(ret) return; foreach(const QModelIndex &index, selectedIndexes) { // Get the file hash - QString hash = getHashFromRow(index.row()); - deleteTorrent(index.row()); + int row = proxyModel->mapToSource(index).row(); + QString hash = getHashFromRow(row); + deleteTorrent(row); BTSession->deleteTorrent(hash, false); } } @@ -407,8 +410,9 @@ void TransferListWidget::deletePermSelectedTorrents() { if(ret) return; foreach(const QModelIndex &index, selectedIndexes) { // Get the file hash - QString hash = getHashFromRow(index.row()); - deleteTorrent(index.row()); + int row = proxyModel->mapToSource(index).row(); + QString hash = getHashFromRow(row); + deleteTorrent(row); BTSession->deleteTorrent(hash, true); } } @@ -418,7 +422,7 @@ void TransferListWidget::deletePermSelectedTorrents() { void TransferListWidget::increasePrioSelectedTorrents() { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); foreach(const QModelIndex &index, selectedIndexes) { - QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(proxyModel->mapToSource(index).row())); if(h.is_valid() && !h.is_seed()) { BTSession->increaseDlTorrentPriority(h.hash()); } @@ -430,7 +434,7 @@ void TransferListWidget::increasePrioSelectedTorrents() { void TransferListWidget::decreasePrioSelectedTorrents() { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); foreach(const QModelIndex &index, selectedIndexes) { - QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(proxyModel->mapToSource(index).row())); if(h.is_valid() && !h.is_seed()) { BTSession->decreaseDlTorrentPriority(h.hash()); } @@ -441,7 +445,7 @@ void TransferListWidget::decreasePrioSelectedTorrents() { void TransferListWidget::buySelectedTorrents() const { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); foreach(const QModelIndex &index, selectedIndexes) { - QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(proxyModel->mapToSource(index).row())); if(h.is_valid()) QDesktopServices::openUrl("http://match.sharemonkey.com/?info_hash="+h.hash()+"&n="+h.name()+"&cid=33"); } @@ -451,7 +455,7 @@ void TransferListWidget::copySelectedMagnetURIs() const { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); QStringList magnet_uris; foreach(const QModelIndex &index, selectedIndexes) { - QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(proxyModel->mapToSource(index).row())); if(h.is_valid()) magnet_uris << misc::toQString(make_magnet_uri(h.get_torrent_info())); } @@ -466,7 +470,7 @@ void TransferListWidget::openSelectedTorrentsFolder() const { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); QStringList pathsList; foreach(const QModelIndex &index, selectedIndexes) { - QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(proxyModel->mapToSource(index).row())); if(h.is_valid()) { QString savePath = h.save_path(); if(!pathsList.contains(savePath)) { @@ -481,7 +485,7 @@ void TransferListWidget::previewSelectedTorrents() { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); QStringList pathsList; foreach(const QModelIndex &index, selectedIndexes) { - QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(index.row())); + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(proxyModel->mapToSource(index).row())); if(h.is_valid()) { new previewSelect(this, h); } @@ -493,7 +497,7 @@ void TransferListWidget::setDlLimitSelectedTorrents() { QStringList hashes; foreach(const QModelIndex &index, selectedIndexes) { // Get the file hash - QString hash = getHashFromRow(index.row()); + QString hash = getHashFromRow(proxyModel->mapToSource(index).row()); QTorrentHandle h = BTSession->getTorrentHandle(hash); if(h.is_valid() && !h.is_seed()) hashes << hash; @@ -507,7 +511,7 @@ void TransferListWidget::setUpLimitSelectedTorrents() { QStringList hashes; foreach(const QModelIndex &index, selectedIndexes) { // Get the file hash - hashes << getHashFromRow(index.row()); + hashes << getHashFromRow(proxyModel->mapToSource(index).row()); } Q_ASSERT(hashes.size() > 0); new BandwidthAllocationDialog(this, true, BTSession, hashes); @@ -516,7 +520,7 @@ void TransferListWidget::setUpLimitSelectedTorrents() { void TransferListWidget::recheckSelectedTorrents() { QModelIndexList selectedIndexes = selectionModel()->selectedRows(); foreach(const QModelIndex &index, selectedIndexes){ - QString hash = getHashFromRow(index.row()); + QString hash = getHashFromRow(proxyModel->mapToSource(index).row()); QTorrentHandle h = BTSession->getTorrentHandle(hash); if(h.is_valid() && h.has_metadata()) h.force_recheck(); @@ -622,7 +626,7 @@ void TransferListWidget::displayListMenu(const QPoint&) { qDebug("Displaying menu"); foreach(const QModelIndex &index, selectedIndexes) { // Get the file name - QString hash = getHashFromRow(index.row()); + QString hash = getHashFromRow(proxyModel->mapToSource(index).row()); // Get handle and pause the torrent h = BTSession->getTorrentHandle(hash); if(!h.is_valid()) continue; From 9f9f6abec1277a370c7151b303fda7560985a19d Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 10:26:39 +0000 Subject: [PATCH 13/34] - Remove outdated files --- src/DLListDelegate.h | 116 ----- src/FinishedListDelegate.h | 98 ---- src/FinishedTorrents.cpp | 699 ---------------------------- src/FinishedTorrents.h | 105 ----- src/Icons/oxygen/time.png | Bin 856 -> 0 bytes src/Icons/skin/queued.png | Bin 493 -> 0 bytes src/TransferListFiltersWidget.h | 4 + src/download.ui | 193 -------- src/downloadingTorrents.cpp | 774 -------------------------------- src/downloadingTorrents.h | 107 ----- src/icons.qrc | 2 - src/src.pro | 10 +- src/webui/scripts/client.js | 4 +- 13 files changed, 8 insertions(+), 2104 deletions(-) delete mode 100644 src/DLListDelegate.h delete mode 100644 src/FinishedListDelegate.h delete mode 100644 src/FinishedTorrents.cpp delete mode 100644 src/FinishedTorrents.h delete mode 100644 src/Icons/oxygen/time.png delete mode 100644 src/Icons/skin/queued.png create mode 100644 src/TransferListFiltersWidget.h delete mode 100644 src/download.ui delete mode 100644 src/downloadingTorrents.cpp delete mode 100644 src/downloadingTorrents.h diff --git a/src/DLListDelegate.h b/src/DLListDelegate.h deleted file mode 100644 index 641e493c0..000000000 --- a/src/DLListDelegate.h +++ /dev/null @@ -1,116 +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 DLLISTDELEGATE_H -#define DLLISTDELEGATE_H - -#include -#include -#include -#include -#include -#include -#include -#include "misc.h" - -// Defines for download list list columns -#define NAME 0 -#define SIZE 1 -#define PROGRESS 2 -#define DLSPEED 3 -#define UPSPEED 4 -#define SEEDSLEECH 5 -#define RATIO 6 -#define ETA 7 -#define PRIORITY 8 -#define HASH 9 - -class DLListDelegate: public QItemDelegate { - Q_OBJECT - - public: - DLListDelegate(QObject *parent) : QItemDelegate(parent){} - - ~DLListDelegate(){} - - void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ - QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); - switch(index.column()){ - case SIZE: - QItemDelegate::drawBackground(painter, opt, index); - QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); - break; - case ETA: - QItemDelegate::drawBackground(painter, opt, index); - QItemDelegate::drawDisplay(painter, opt, option.rect, misc::userFriendlyDuration(index.data().toLongLong())); - break; - case UPSPEED: - case DLSPEED:{ - QItemDelegate::drawBackground(painter, opt, index); - double speed = index.data().toDouble(); - QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(speed/1024., 'f', 1))+QString::fromUtf8(" ")+tr("KiB/s")); - break; - } - case RATIO:{ - QItemDelegate::drawBackground(painter, opt, index); - double ratio = index.data().toDouble(); - if(ratio > 100.) - QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8("∞")); - else - QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1))); - break; - } - case PROGRESS:{ - QStyleOptionProgressBarV2 newopt; - double progress = index.data().toDouble()*100.; - newopt.rect = opt.rect; - newopt.text = QString(QByteArray::number(progress, 'f', 1))+QString::fromUtf8("%"); - newopt.progress = (int)progress; - newopt.maximum = 100; - newopt.minimum = 0; - newopt.state |= QStyle::State_Enabled; - newopt.textVisible = true; - QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, - painter); - break; - } - default: - QItemDelegate::paint(painter, option, index); - } - } - - QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const { - // No editor here - return 0; - } - -}; - -#endif diff --git a/src/FinishedListDelegate.h b/src/FinishedListDelegate.h deleted file mode 100644 index 0fb0495a4..000000000 --- a/src/FinishedListDelegate.h +++ /dev/null @@ -1,98 +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 FINISHEDLISTDELEGATE_H -#define FINISHEDLISTDELEGATE_H - -#include -#include -#include -#include -#include -#include -#include -#include "misc.h" - -// Defines for download list list columns -#define F_NAME 0 -#define F_SIZE 1 -#define F_UPSPEED 2 -#define F_SWARM 3 -#define F_PEERS 4 -#define F_UPLOAD 5 -#define F_RATIO 6 -#define F_HASH 7 - -#define MAX_RATIO 100. - -class FinishedListDelegate: public QItemDelegate { - Q_OBJECT - - public: - FinishedListDelegate(QObject *parent) : QItemDelegate(parent){} - - ~FinishedListDelegate(){} - - void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ - QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); - switch(index.column()){ - case F_SIZE: - case F_UPLOAD: - QItemDelegate::drawBackground(painter, opt, index); - QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); - break; - case F_UPSPEED:{ - QItemDelegate::drawBackground(painter, opt, index); - double speed = index.data().toDouble(); - QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(speed/1024., 'f', 1))+QString::fromUtf8(" ")+tr("KiB/s")); - break; - } - case F_RATIO:{ - QItemDelegate::drawBackground(painter, opt, index); - double ratio = index.data().toDouble(); - if(ratio > MAX_RATIO) - QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8("∞")); - else - QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1))); - break; - } - default: - QItemDelegate::paint(painter, option, index); - } - } - - QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const { - // No editor here - return 0; - } - -}; - -#endif diff --git a/src/FinishedTorrents.cpp b/src/FinishedTorrents.cpp deleted file mode 100644 index 9feace584..000000000 --- a/src/FinishedTorrents.cpp +++ /dev/null @@ -1,699 +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 - */ -#include "FinishedTorrents.h" -#include "misc.h" -#include "properties_imp.h" -#include "bittorrent.h" -#include "allocationDlg.h" -#include "FinishedListDelegate.h" -#include "GUI.h" - -#include -#include -#include -#include -#include -#include -#include - -FinishedTorrents::FinishedTorrents(QObject *parent, bittorrent *BTSession) : parent(parent), BTSession(BTSession), nbFinished(0){ - setupUi(this); - actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png"))); - actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png"))); - finishedListModel = new QStandardItemModel(0,8); - finishedListModel->setHeaderData(F_NAME, Qt::Horizontal, tr("Name", "i.e: file name")); - finishedListModel->setHeaderData(F_SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); - finishedListModel->setHeaderData(F_UPSPEED, Qt::Horizontal, tr("UP Speed", "i.e: Upload speed")); - finishedListModel->setHeaderData(F_SWARM, Qt::Horizontal, tr("Seeds / Leechers")); - finishedListModel->setHeaderData(F_PEERS, Qt::Horizontal, tr("Connected peers")); - finishedListModel->setHeaderData(F_UPLOAD, Qt::Horizontal, tr("Total uploaded", "i.e: Total amount of uploaded data")); - finishedListModel->setHeaderData(F_RATIO, Qt::Horizontal, tr("Ratio")); - - proxyModel = new QSortFilterProxyModel(); - proxyModel->setDynamicSortFilter(true); - proxyModel->setSourceModel(finishedListModel); - finishedList->setModel(proxyModel); - - finishedList->setRootIsDecorated(false); - finishedList->setAllColumnsShowFocus(true); - finishedList->setSortingEnabled(true); - - loadHiddenColumns(); - // Hide hash column - finishedList->hideColumn(F_HASH); - // Load last columns width for download list - if(!loadColWidthFinishedList()){ - finishedList->header()->resizeSection(0, 200); - } - // Connect BTSession signals - connect(BTSession, SIGNAL(metadataReceived(QTorrentHandle&)), this, SLOT(updateMetadata(QTorrentHandle&))); - // Make download list header clickable for sorting - finishedList->header()->setClickable(true); - finishedList->header()->setSortIndicatorShown(true); - finishedListDelegate = new FinishedListDelegate(finishedList); - finishedList->setItemDelegate(finishedListDelegate); - connect(finishedList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedListMenu(const QPoint&))); - finishedList->header()->setContextMenuPolicy(Qt::CustomContextMenu); - connect(finishedList->header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFinishedHoSMenu(const QPoint&))); - connect(finishedList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(notifyTorrentDoubleClicked(const QModelIndex&))); - actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png"))); - actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png"))); - actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.png"))); - actionTorrent_Properties->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/properties.png"))); - actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))); - actionCopy_magnet_link->setIcon(QIcon(QString::fromUtf8(":/Icons/magnet.png"))); - - connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered())); - connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered())); - connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered())); - connect(actionPreview_file, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPreview_file_triggered())); - connect(actionDelete_Permanently, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_Permanently_triggered())); - connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder())); - connect(actionBuy_it, SIGNAL(triggered()), (GUI*)parent, SLOT(goBuyPage())); - connect(actionTorrent_Properties, SIGNAL(triggered()), this, SLOT(propertiesSelection())); - connect(actionForce_recheck, SIGNAL(triggered()), this, SLOT(forceRecheck())); - connect(actionCopy_magnet_link, SIGNAL(triggered()), (GUI*)parent, SLOT(copyMagnetURI())); - - connect(actionHOSColName, SIGNAL(triggered()), this, SLOT(hideOrShowColumnName())); - connect(actionHOSColSize, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSize())); - connect(actionHOSColUpSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpSpeed())); - connect(actionHOSColSwarm, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSwarm())); - connect(actionHOSColPeers, SIGNAL(triggered()), this, SLOT(hideOrShowColumnPeers())); - connect(actionHOSColUpload, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpload())); - connect(actionHOSColRatio, SIGNAL(triggered()), this, SLOT(hideOrShowColumnRatio())); -} - -FinishedTorrents::~FinishedTorrents(){ - saveLastSortedColumn(); - saveColWidthFinishedList(); - saveHiddenColumns(); - delete finishedListDelegate; - delete proxyModel; - delete finishedListModel; -} - -void FinishedTorrents::notifyTorrentDoubleClicked(const QModelIndex& index) { - unsigned int row = index.row(); - QString hash = getHashFromRow(row); - emit torrentDoubleClicked(hash, true); -} - -void FinishedTorrents::addTorrent(QString hash){ - int row = getRowFromHash(hash); - if(row != -1) return; - row = finishedListModel->rowCount(); - QTorrentHandle h = BTSession->getTorrentHandle(hash); - // Adding torrent to download list - finishedListModel->insertRow(row); - finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(h.name())); - finishedListModel->setData(finishedListModel->index(row, F_SIZE), QVariant((qlonglong)h.actual_size())); - finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.)); - finishedListModel->setData(finishedListModel->index(row, F_SWARM), QVariant("-1/-1")); - finishedListModel->setData(finishedListModel->index(row, F_PEERS), QVariant("0")); - finishedListModel->setData(finishedListModel->index(row, F_UPLOAD), QVariant((qlonglong)h.all_time_upload())); - finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(QString::fromUtf8(misc::toString(BTSession->getRealRatio(hash)).c_str()))); - finishedListModel->setData(finishedListModel->index(row, F_HASH), QVariant(hash)); - if(h.is_paused()) { - finishedListModel->setData(finishedListModel->index(row, F_NAME), QIcon(":/Icons/skin/paused.png"), Qt::DecorationRole); - setRowColor(row, "red"); - }else{ - finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(":/Icons/skin/seeding.png")), Qt::DecorationRole); - setRowColor(row, "orange"); - } - // Update the number of finished torrents - ++nbFinished; - emit finishedTorrentsNumberChanged(nbFinished); - - loadLastSortedColumn(); -} - -// Set the color of a row in data model -void FinishedTorrents::setRowColor(int row, QString color){ - unsigned int nbColumns = finishedListModel->columnCount()-1; - for(unsigned int i=0; isetData(finishedListModel->index(row, i), QVariant(QColor(color)), Qt::ForegroundRole); - } -} - -QStringList FinishedTorrents::getSelectedTorrents(bool only_one) const{ - QStringList res; - QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes) { - if(index.column() == F_NAME) { - // Get the file hash - QString hash = getHashFromRow(index.row()); - res << hash; - if(only_one) break; - } - } - return res; -} - -unsigned int FinishedTorrents::getNbTorrentsInList() const { - return nbFinished; -} - -// Load columns width in a file that were saved previously -// (finished list) -bool FinishedTorrents::loadColWidthFinishedList(){ - qDebug("Loading columns width for finished list"); - QSettings settings("qBittorrent", "qBittorrent"); - QString line = settings.value("FinishedListColsWidth", QString()).toString(); - if(line.isEmpty()) - return false; - QStringList width_list = line.split(' '); - if(width_list.size() < finishedListModel->columnCount()-1) - return false; - unsigned int listSize = width_list.size(); - for(unsigned int i=0; iheader()->resizeSection(i, width_list.at(i).toInt()); - } - loadLastSortedColumn(); - QVariantList visualIndexes = settings.value(QString::fromUtf8("FinishedListVisualIndexes"), QVariantList()).toList(); - if(visualIndexes.size() != finishedListModel->columnCount()-1) { - qDebug("Corrupted values for download list columns sizes"); - return false; - } - bool change = false; - do { - change = false; - for(int i=0;iheader()->logicalIndex(i)).toInt(); - if(i != new_visual_index) { - qDebug("Moving column from %d to %d", finishedList->header()->logicalIndex(i), new_visual_index); - finishedList->header()->moveSection(i, new_visual_index); - change = true; - } - } - }while(change); - qDebug("Finished list columns width loaded"); - return true; -} - -void FinishedTorrents::saveLastSortedColumn() { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - Qt::SortOrder sortOrder = finishedList->header()->sortIndicatorOrder(); - QString sortOrderLetter; - if(sortOrder == Qt::AscendingOrder) - sortOrderLetter = QString::fromUtf8("a"); - else - sortOrderLetter = QString::fromUtf8("d"); - int index = finishedList->header()->sortIndicatorSection(); - settings.setValue(QString::fromUtf8("FinishedListSortedCol"), misc::toQString(index)+sortOrderLetter); -} - -void FinishedTorrents::loadLastSortedColumn() { - // Loading last sorted column - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - QString sortedCol = settings.value(QString::fromUtf8("FinishedListSortedCol"), QString()).toString(); - if(!sortedCol.isEmpty()) { - Qt::SortOrder sortOrder; - if(sortedCol.endsWith(QString::fromUtf8("d"))) - sortOrder = Qt::DescendingOrder; - else - sortOrder = Qt::AscendingOrder; - sortedCol = sortedCol.left(sortedCol.size()-1); - int index = sortedCol.toInt(); - finishedList->sortByColumn(index, sortOrder); - } -} - -// Save columns width in a file to remember them -// (finished list) -void FinishedTorrents::saveColWidthFinishedList() const{ - qDebug("Saving columns width in finished list"); - QSettings settings("qBittorrent", "qBittorrent"); - QStringList width_list; - QStringList new_width_list; - short nbColumns = finishedListModel->columnCount()-1; - - QString line = settings.value("FinishedListColsWidth", QString()).toString(); - if(!line.isEmpty()) { - width_list = line.split(' '); - } - for(short i=0; icolumnWidth(i)<1 && width_list.size() == nbColumns && width_list.at(i).toInt()>=1) { - // load the former width - new_width_list << width_list.at(i); - } else if(finishedList->columnWidth(i)>=1) { - // usual case, save the current width - new_width_list << QString::fromUtf8(misc::toString(finishedList->columnWidth(i)).c_str()); - } else { - // default width - finishedList->resizeColumnToContents(i); - new_width_list << QString::fromUtf8(misc::toString(finishedList->columnWidth(i)).c_str()); - } - } - settings.setValue("FinishedListColsWidth", new_width_list.join(" ")); - QVariantList visualIndexes; - for(int i=0; iheader()->visualIndex(i)); - } - settings.setValue(QString::fromUtf8("FinishedListVisualIndexes"), visualIndexes); - qDebug("Finished list columns width saved"); -} - -void FinishedTorrents::on_actionSet_upload_limit_triggered(){ - QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); - QStringList hashes; - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == F_NAME){ - // Get the file hash - hashes << getHashFromRow(index.row()); - } - } - new BandwidthAllocationDialog(this, true, BTSession, hashes); -} - -void FinishedTorrents::updateMetadata(QTorrentHandle &h) { - QString hash = h.hash(); - int row = getRowFromHash(hash); - if(row != -1) { - qDebug("Updating torrent metadata in download list"); - finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(h.name())); - finishedListModel->setData(finishedListModel->index(row, F_SIZE), QVariant((qlonglong)h.actual_size())); - } -} - -void FinishedTorrents::updateTorrent(QTorrentHandle h) { - if(!h.is_valid()) return; - QString hash = h.hash(); - int row = getRowFromHash(hash); - if(row == -1){ - qDebug("Cannot find torrent in finished list, adding it"); - addTorrent(hash); - row = getRowFromHash(hash); - } - Q_ASSERT(row != -1); - if(!finishedList->isColumnHidden(F_SWARM)) { - finishedListModel->setData(finishedListModel->index(row, F_SWARM), misc::toQString(h.num_complete())+QString("/")+misc::toQString(h.num_incomplete())); - } - if(h.is_paused()) return; - // Update queued torrent - if(BTSession->isQueueingEnabled() && h.is_queued()) { - if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){ - finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole); - } else { - finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/queued.png"))), Qt::DecorationRole); - } - // Reset upload speed and seeds/leech - finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), 0.); - finishedListModel->setData(finishedListModel->index(row, F_PEERS), "0"); - setRowColor(row, QString::fromUtf8("grey")); - return; - } - if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking){ - finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/time.png"))), Qt::DecorationRole); - setRowColor(row, QString::fromUtf8("grey")); - return; - } - setRowColor(row, QString::fromUtf8("orange")); - finishedListModel->setData(finishedListModel->index(row, F_NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))), Qt::DecorationRole); - if(!finishedList->isColumnHidden(F_UPSPEED)) { - finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)h.upload_payload_rate())); - } - if(!finishedList->isColumnHidden(F_PEERS)) { - finishedListModel->setData(finishedListModel->index(row, F_PEERS), misc::toQString(h.num_peers() - h.num_seeds(), true)); - } - if(!finishedList->isColumnHidden(F_UPLOAD)) { - finishedListModel->setData(finishedListModel->index(row, F_UPLOAD), QVariant((double)h.all_time_upload())); - } - if(!finishedList->isColumnHidden(F_RATIO)) { - finishedListModel->setData(finishedListModel->index(row, F_RATIO), QVariant(misc::toQString(BTSession->getRealRatio(hash)))); - } -} - -int FinishedTorrents::getRowFromHash(QString hash) const{ - unsigned int nbRows = finishedListModel->rowCount(); - for(unsigned int i=0; idata(finishedListModel->index(i, F_HASH)) == hash){ - return i; - } - } - return -1; -} - -// Note: does not actually pause the torrent in BT Session -void FinishedTorrents::pauseTorrent(QString hash) { - int row = getRowFromHash(hash); - if(row == -1) - return; - finishedListModel->setData(finishedListModel->index(row, F_UPSPEED), QVariant((double)0.0)); - finishedListModel->setData(finishedListModel->index(row, F_NAME), QIcon(QString::fromUtf8(":/Icons/skin/paused.png")), Qt::DecorationRole); - finishedListModel->setData(finishedListModel->index(row, F_PEERS), QVariant(QString::fromUtf8("0"))); - setRowColor(row, QString::fromUtf8("red")); -} - -QString FinishedTorrents::getHashFromRow(unsigned int row) const { - Q_ASSERT(row < (unsigned int)proxyModel->rowCount()); - return proxyModel->data(proxyModel->index(row, F_HASH)).toString(); -} - -// Will move it to download tab -void FinishedTorrents::deleteTorrent(QString hash){ - int row = getRowFromHash(hash); - if(row == -1){ - qDebug("Torrent is not in finished list, nothing to delete"); - return; - } - // Select item just under (or above nothing under) the one that was deleted - QModelIndex current_prox_index = proxyModel->mapFromSource(finishedListModel->index(row, 0, finishedList->rootIndex())); - bool was_selected = finishedList->selectionModel()->isSelected(current_prox_index); - if(finishedListModel->rowCount() > 1 && was_selected) { - QModelIndex under_prox_index; - if(current_prox_index.row() == finishedListModel->rowCount()-1) - under_prox_index = proxyModel->index(current_prox_index.row()-1, 0); - else - under_prox_index = proxyModel->index(current_prox_index.row()+1, 0); - //downloadList->selectionModel()->select(under_prox_index, QItemSelectionModel::Current|QItemSelectionModel::Columns|QItemSelectionModel::Select); - finishedList->setCurrentIndex(under_prox_index); - finishedList->update(); - } - // Actually delete the row - finishedListModel->removeRow(row); - --nbFinished; - emit finishedTorrentsNumberChanged(nbFinished); -} - -// Show torrent properties dialog -void FinishedTorrents::showProperties(const QModelIndex &index){ - showPropertiesFromHash(getHashFromRow(index.row())); -} - -void FinishedTorrents::showPropertiesFromHash(QString hash){ - QTorrentHandle h = BTSession->getTorrentHandle(hash); - properties *prop = new properties(this, BTSession, h); - connect(prop, SIGNAL(filteredFilesChanged(QString)), this, SLOT(updateFileSize(QString))); - connect(prop, SIGNAL(trackersChanged(QString)), BTSession, SLOT(saveTrackerFile(QString))); - prop->show(); -} - -void FinishedTorrents::updateFileSize(QString hash){ - int row = getRowFromHash(hash); - QTorrentHandle h = BTSession->getTorrentHandle(hash); - finishedListModel->setData(finishedListModel->index(row, F_SIZE), QVariant((qlonglong)h.actual_size())); -} - -// display properties of selected items -void FinishedTorrents::propertiesSelection(){ - QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == F_NAME){ - showProperties(index); - } - } -} - -void FinishedTorrents::forceRecheck(){ - QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == F_NAME){ - QString hash = getHashFromRow(index.row()); - QTorrentHandle h = BTSession->getTorrentHandle(hash); - qDebug("Forcing recheck for torrent %s", hash.toLocal8Bit().data()); - h.force_recheck(); - } - } -} - -void FinishedTorrents::displayFinishedListMenu(const QPoint&){ - QMenu myFinishedListMenu(this); - // Enable/disable pause/start action given the DL state - QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); - bool has_pause = false, has_start = false, has_preview = false, hide_uper_seeding = false, super_seeding_enabled = false; - bool first_torrent = true; - foreach(const QModelIndex &index, selectedIndexes) { - if(index.column() == F_NAME) { - // Get the file name - QString hash = getHashFromRow(index.row()); - // Get handle and pause the torrent - QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(!h.is_valid()) continue; - if(h.is_paused()) { - if(!has_start) { - myFinishedListMenu.addAction(actionStart); - has_start = true; - } - }else{ - if(!has_pause) { - myFinishedListMenu.addAction(actionPause); - has_pause = true; - } - } - if(BTSession->isFilePreviewPossible(hash) && !has_preview) { - myFinishedListMenu.addAction(actionPreview_file); - has_preview = true; - } - if(h.super_seeding()) { - if(first_torrent) { - super_seeding_enabled = true; - } else { - if(!super_seeding_enabled) hide_uper_seeding = true; - } - } else { - if(!first_torrent) { - if(super_seeding_enabled) hide_uper_seeding = true; - } - } - first_torrent = false; - if(has_pause && has_start && has_preview && hide_uper_seeding) break; - } - } - myFinishedListMenu.addSeparator(); - myFinishedListMenu.addAction(actionDelete); - myFinishedListMenu.addAction(actionDelete_Permanently); - myFinishedListMenu.addSeparator(); - if(!hide_uper_seeding) { - QAction *act; - if(super_seeding_enabled) - act = myFinishedListMenu.addAction(QIcon(":/Icons/oxygen/button_ok.png"), tr("Super seeding mode")); - else - act = myFinishedListMenu.addAction(QIcon(":/Icons/oxygen/button_cancel.png"), tr("Super seeding mode")); - // Bind signal / slot - connect(act, SIGNAL(triggered()), this, SLOT(toggleSuperSeedingMode())); - } - myFinishedListMenu.addAction(actionSet_upload_limit); - myFinishedListMenu.addSeparator(); - myFinishedListMenu.addAction(actionForce_recheck); - myFinishedListMenu.addSeparator(); - myFinishedListMenu.addAction(actionOpen_destination_folder); - myFinishedListMenu.addAction(actionTorrent_Properties); - myFinishedListMenu.addSeparator(); - myFinishedListMenu.addAction(actionCopy_magnet_link); - myFinishedListMenu.addAction(actionBuy_it); - - // Call menu - myFinishedListMenu.exec(QCursor::pos()); -} - - -/* - * Hiding Columns functions - */ - -// hide/show columns menu -void FinishedTorrents::displayFinishedHoSMenu(const QPoint&){ - QMenu hideshowColumn(this); - hideshowColumn.setTitle(tr("Hide or Show Column")); - int lastCol = F_RATIO; - for(int i=0; i<=lastCol; i++) { - hideshowColumn.addAction(getActionHoSCol(i)); - } - // Call menu - hideshowColumn.exec(QCursor::pos()); -} - -void FinishedTorrents::toggleSuperSeedingMode() { - QModelIndexList selectedIndexes = finishedList->selectionModel()->selectedIndexes(); - bool super_seeding_enabled = false, first_torrent=true; - // Check whether we should disable or enable super seeding mode - foreach(const QModelIndex &index, selectedIndexes) { - if(index.column() == F_NAME) { - // Get the file name - QString hash = getHashFromRow(index.row()); - // Get handle and pause the torrent - QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(!h.is_valid()) continue; - if(h.super_seeding()) { - if(first_torrent) { - super_seeding_enabled = true; - } - } else { - if(!first_torrent) { - if(super_seeding_enabled) super_seeding_enabled = false; - } - } - first_torrent = false; - } - } - // Toggling super seeding mode - foreach(const QModelIndex &index, selectedIndexes) { - if(index.column() == F_NAME) { - // Get the file name - QString hash = getHashFromRow(index.row()); - // Get handle and pause the torrent - QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(!h.is_valid()) continue; - qDebug("Seeding mode=%d for torrent %s",!super_seeding_enabled, h.name().toLocal8Bit().data()); - h.super_seeding(!super_seeding_enabled); - } - } -} - -// toggle hide/show a column -void FinishedTorrents::hideOrShowColumn(int index) { - unsigned int nbVisibleColumns = 0; - unsigned int nbCols = finishedListModel->columnCount(); - // Count visible columns - for(unsigned int i=0; iisColumnHidden(i)) - ++nbVisibleColumns; - } - if(!finishedList->isColumnHidden(index)) { - // User wants to hide the column - // Is there at least one other visible column? - if(nbVisibleColumns <= 1) return; - // User can hide the column, do it. - finishedList->setColumnHidden(index, true); - getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); - --nbVisibleColumns; - } else { - // User want to display the column - finishedList->setColumnHidden(index, false); - getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); - ++nbVisibleColumns; - } - //resize all others non-hidden columns - for(unsigned int i=0; iisColumnHidden(i)) { - finishedList->setColumnWidth(i, (int)ceil(finishedList->columnWidth(i)+(finishedList->columnWidth(index)/nbVisibleColumns))); - } - } -} - -void FinishedTorrents::hideOrShowColumnName() { - hideOrShowColumn(F_NAME); -} - -void FinishedTorrents::hideOrShowColumnSize() { - hideOrShowColumn(F_SIZE); -} - -void FinishedTorrents::hideOrShowColumnUpSpeed() { - hideOrShowColumn(F_UPSPEED); -} - -void FinishedTorrents::hideOrShowColumnSwarm() { - hideOrShowColumn(F_SWARM); -} - -void FinishedTorrents::hideOrShowColumnPeers() { - hideOrShowColumn(F_PEERS); -} - -void FinishedTorrents::hideOrShowColumnUpload() { - hideOrShowColumn(F_UPLOAD); -} - -void FinishedTorrents::hideOrShowColumnRatio() { - hideOrShowColumn(F_RATIO); -} - -// load the previous settings, and hide the columns -bool FinishedTorrents::loadHiddenColumns() { - bool loaded = false; - QSettings settings("qBittorrent", "qBittorrent"); - QString line = settings.value("FinishedListColsHoS", QString()).toString(); - QStringList ishidden_list; - if(!line.isEmpty()) { - ishidden_list = line.split(' '); - if(ishidden_list.size() == finishedListModel->columnCount()-1) { - unsigned int listSize = ishidden_list.size(); - for(unsigned int i=0; iheader()->resizeSection(i, ishidden_list.at(i).toInt()); - } - loaded = true; - } - } - for(int i=0; icolumnCount()-1; i++) { - if(loaded && ishidden_list.at(i) == "0") { - finishedList->setColumnHidden(i, true); - getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); - } else { - getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); - } - } - return loaded; -} - -// save the hidden columns in settings -void FinishedTorrents::saveHiddenColumns() { - QSettings settings("qBittorrent", "qBittorrent"); - QStringList ishidden_list; - short nbColumns = finishedListModel->columnCount()-1; - - for(short i=0; iisColumnHidden(i)) { - ishidden_list << QString::fromUtf8(misc::toString(0).c_str()); - } else { - ishidden_list << QString::fromUtf8(misc::toString(1).c_str()); - } - } - settings.setValue("FinishedListColsHoS", ishidden_list.join(" ")); -} - -// getter, return the action hide or show whose id is index -QAction* FinishedTorrents::getActionHoSCol(int index) { - switch(index) { - case F_NAME : - return actionHOSColName; - break; - case F_SIZE : - return actionHOSColSize; - break; - case F_UPSPEED : - return actionHOSColUpSpeed; - break; - case F_SWARM : - return actionHOSColSwarm; - break; - case F_PEERS : - return actionHOSColPeers; - break; - case F_UPLOAD : - return actionHOSColUpload; - break; - case F_RATIO : - return actionHOSColRatio; - break; - default : - return NULL; - } -} diff --git a/src/FinishedTorrents.h b/src/FinishedTorrents.h deleted file mode 100644 index f28cac0a7..000000000 --- a/src/FinishedTorrents.h +++ /dev/null @@ -1,105 +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 SEEDING_H -#define SEEDING_H - -#include "ui_seeding.h" -#include "qtorrenthandle.h" - -class QStandardItemModel; -class QSortFilterProxyModel; -class bittorrent; -class FinishedListDelegate; - -using namespace libtorrent; - -class FinishedTorrents : public QWidget, public Ui::seeding { - Q_OBJECT - private: - QObject *parent; - bittorrent *BTSession; - FinishedListDelegate *finishedListDelegate; - QStandardItemModel *finishedListModel; - QSortFilterProxyModel *proxyModel; - unsigned int nbFinished; - void hideOrShowColumn(int index); - bool loadHiddenColumns(); - void saveHiddenColumns(); - QAction* getActionHoSCol(int index); - - public: - FinishedTorrents(QObject *parent, bittorrent *BTSession); - ~FinishedTorrents(); - // Methods - bool loadColWidthFinishedList(); - int getRowFromHash(QString hash) const; - QStringList getSelectedTorrents(bool only_one=false) const; - unsigned int getNbTorrentsInList() const; - QString getHashFromRow(unsigned int row) const; - - protected slots: - void showProperties(const QModelIndex &index); - void displayFinishedListMenu(const QPoint&); - void displayFinishedHoSMenu(const QPoint&); - void setRowColor(int row, QString color); - void saveColWidthFinishedList() const; - void updateFileSize(QString hash); - void on_actionSet_upload_limit_triggered(); - void notifyTorrentDoubleClicked(const QModelIndex& index); - void hideOrShowColumnName(); - void hideOrShowColumnSize(); - void hideOrShowColumnUpSpeed(); - void hideOrShowColumnSwarm(); - void hideOrShowColumnPeers(); - void hideOrShowColumnUpload(); - void hideOrShowColumnRatio(); - void forceRecheck(); - void toggleSuperSeedingMode(); - - public slots: - void addTorrent(QString hash); - void updateTorrent(QTorrentHandle h); - void pauseTorrent(QString hash); - void propertiesSelection(); - void deleteTorrent(QString hash); - void showPropertiesFromHash(QString hash); - void loadLastSortedColumn(); - void saveLastSortedColumn(); - void updateMetadata(QTorrentHandle &h); - - signals: - void torrentMovedFromFinishedList(QString); - void torrentDoubleClicked(QString hash, bool finished); - void finishedTorrentsNumberChanged(unsigned int); - -}; - -#endif diff --git a/src/Icons/oxygen/time.png b/src/Icons/oxygen/time.png deleted file mode 100644 index a76a31d2eca85e28543e44773eac3cf4a15697ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 856 zcmV-e1E>6nP)%s^y>CCW47 z$4}Xs-SpzggFW9~KfMM3tYoR{F9@L^KN0g?hJ3e@{;IQ-5r zZkU$2!6jFeQkeGL%#DkS+;aRtPJenlAB-{rIyInBfB{l!n);@y?%5ND8_G);t*QXP z`~2)n+3S8@_wd0E*FcZiqy=;w;C6d7kL)dCZJk}8xpl5=IiEj@i#S*PE~NdH{ce~p zkYP1z=$B!6Av_|Y+Q=<0n+Df6#6rF5m@j^bLu=bI=yeI!ep zmKZM9G;}6>9rE0IapUBNzXg|w>kr+^N{u$=SC-~=Z&+t`iL)M#=LK79@2}{Rih7qJ zB<*r*?M`V0G4|k%{58?>$pv}a9h><9V_)ano&Eh^(+MFHXV08p==do)%B$>rs9r4Y zd3;3y00Ns$Ju>7k$+XT!sYc!xd}?Vbnx68e+BR(ri;0bidh_O0Y=|_SG7;J~qN9TGk2$IvCx=Px#0%A)?L;(MXkIcUS000SaNLh0L00ZR!00ZR#yh}g$00007bV*G`2iOM=6CfHE zz+W%`00D7HL_t(2&rQ+0Ym;#lhw)YDio1h@7o0k{#9Qz}Bf(1p4b~wqQc*K#X4#d|=Ns*4mTw!QFDy7_R>_k`;1`d$()f^`dVPKLsbAb3 jb~z$;th4CN*KL4*LTq1x{uEUd00000NkvXXu0mjfaiZ3= diff --git a/src/TransferListFiltersWidget.h b/src/TransferListFiltersWidget.h new file mode 100644 index 000000000..daed7e157 --- /dev/null +++ b/src/TransferListFiltersWidget.h @@ -0,0 +1,4 @@ +#ifndef TRANSFERLISTFILTERSWIDGET_H +#define TRANSFERLISTFILTERSWIDGET_H + +#endif // TRANSFERLISTFILTERSWIDGET_H diff --git a/src/download.ui b/src/download.ui deleted file mode 100644 index 306afb48f..000000000 --- a/src/download.ui +++ /dev/null @@ -1,193 +0,0 @@ - - - downloading - - - - 0 - 0 - 811 - 453 - - - - Search - - - - - - 6 - - - 0 - - - - - - 0 - 0 - - - - Qt::CustomContextMenu - - - true - - - QAbstractItemView::ExtendedSelection - - - 1 - - - false - - - - - - - - - Start - - - - - Pause - - - - - Delete - - - - - Preview file - - - - - Set upload limit - - - - - Set download limit - - - - - Delete Permanently - - - - - Torrent Properties - - - - - - :/Icons/oxygen/folder.png:/Icons/oxygen/folder.png - - - Open destination folder - - - - - Name - - - - - Size - - - - - Progress - - - - - DLSpeed - - - - - UpSpeed - - - - - Seeds/Leechs - - - - - Ratio - - - - - ETA - - - - - - :/Icons/oxygen/wallet.png:/Icons/oxygen/wallet.png - - - Buy it - - - - - Priority - - - - - - :/Icons/skin/increase.png:/Icons/skin/increase.png - - - Increase priority - - - - - - :/Icons/skin/decrease.png:/Icons/skin/decrease.png - - - Decrease priority - - - - - - :/Icons/oxygen/gear.png:/Icons/oxygen/gear.png - - - Force recheck - - - - - Copy magnet link - - - - - - - - diff --git a/src/downloadingTorrents.cpp b/src/downloadingTorrents.cpp deleted file mode 100644 index c824f7633..000000000 --- a/src/downloadingTorrents.cpp +++ /dev/null @@ -1,774 +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 - */ -#include "downloadingTorrents.h" -#include "misc.h" -#include "properties_imp.h" -#include "bittorrent.h" -#include "allocationDlg.h" -#include "DLListDelegate.h" -#include "GUI.h" - -#include -#include -#include -#include -#include -#include -#include - -DownloadingTorrents::DownloadingTorrents(QObject *parent, bittorrent *BTSession) : parent(parent), BTSession(BTSession), nbTorrents(0) { - setupUi(this); - // Setting icons - actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png"))); - actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png"))); - actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png"))); - actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png"))); - actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png"))); - actionSet_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/downloading.png"))); - actionDelete_Permanently->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete_perm.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/oxygen/log.png"))); - // tabBottom->setTabIcon(1, QIcon(QString::fromUtf8(":/Icons/oxygen/filter.png"))); - - // Set Download list model - DLListModel = new QStandardItemModel(0,10); - DLListModel->setHeaderData(NAME, Qt::Horizontal, tr("Name", "i.e: file name")); - DLListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); - DLListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress", "i.e: % downloaded")); - DLListModel->setHeaderData(DLSPEED, Qt::Horizontal, tr("DL Speed", "i.e: Download speed")); - DLListModel->setHeaderData(UPSPEED, Qt::Horizontal, tr("UP Speed", "i.e: Upload speed")); - DLListModel->setHeaderData(SEEDSLEECH, Qt::Horizontal, tr("Seeds/Leechers", "i.e: full/partial sources")); - DLListModel->setHeaderData(RATIO, Qt::Horizontal, tr("Ratio")); - DLListModel->setHeaderData(ETA, Qt::Horizontal, tr("ETA", "i.e: Estimated Time of Arrival / Time left")); - DLListModel->setHeaderData(PRIORITY, Qt::Horizontal, "#"); - downloadList->setRootIsDecorated(false); - downloadList->setAllColumnsShowFocus(true); - DLDelegate = new DLListDelegate(downloadList); - downloadList->setItemDelegate(DLDelegate); - proxyModel = new QSortFilterProxyModel(); - proxyModel->setDynamicSortFilter(true); - proxyModel->setSourceModel(DLListModel); - downloadList->setModel(proxyModel); - downloadList->setSortingEnabled(true); - // Hide priority column - downloadList->hideColumn(PRIORITY); - // Hide hash column - downloadList->hideColumn(HASH); - loadHiddenColumns(); - - connect(BTSession, SIGNAL(metadataReceived(QTorrentHandle&)), this, SLOT(updateMetadata(QTorrentHandle&))); - - // Load last columns width for download list - if(!loadColWidthDLList()) { - downloadList->header()->resizeSection(0, 200); - } - // Make download list header clickable for sorting - downloadList->header()->setClickable(true); - downloadList->header()->setSortIndicatorShown(true); - // Connecting Actions to slots - connect(downloadList, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(notifyTorrentDoubleClicked(const QModelIndex&))); - connect(downloadList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayDLListMenu(const QPoint&))); - downloadList->header()->setContextMenuPolicy(Qt::CustomContextMenu); - connect(downloadList->header(), SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayDLHoSMenu(const QPoint&))); - // Actions - connect(actionPause, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPause_triggered())); - connect(actionStart, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionStart_triggered())); - connect(actionDelete, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_triggered())); - connect(actionIncreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionIncreasePriority_triggered())); - connect(actionDecreasePriority, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDecreasePriority_triggered())); - connect(actionPreview_file, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionPreview_file_triggered())); - connect(actionDelete_Permanently, SIGNAL(triggered()), (GUI*)parent, SLOT(on_actionDelete_Permanently_triggered())); - connect(actionOpen_destination_folder, SIGNAL(triggered()), (GUI*)parent, SLOT(openDestinationFolder())); - connect(actionTorrent_Properties, SIGNAL(triggered()), this, SLOT(propertiesSelection())); - connect(actionForce_recheck, SIGNAL(triggered()), this, SLOT(forceRecheck())); - 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(actionHOSColSize, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSize())); - connect(actionHOSColProgress, SIGNAL(triggered()), this, SLOT(hideOrShowColumnProgress())); - connect(actionHOSColDownSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnDownSpeed())); - connect(actionHOSColUpSpeed, SIGNAL(triggered()), this, SLOT(hideOrShowColumnUpSpeed())); - connect(actionHOSColSeedersLeechers, SIGNAL(triggered()), this, SLOT(hideOrShowColumnSeedersLeechers())); - connect(actionHOSColRatio, SIGNAL(triggered()), this, SLOT(hideOrShowColumnRatio())); - connect(actionHOSColEta, SIGNAL(triggered()), this, SLOT(hideOrShowColumnEta())); - connect(actionHOSColPriority, SIGNAL(triggered()), this, SLOT(hideOrShowColumnPriority())); - - // Load last sorted column - loadLastSortedColumn(); - // Set info Bar infos - BTSession->addConsoleMessage(tr("qBittorrent %1 started.", "e.g: qBittorrent v0.x started.").arg(QString::fromUtf8(""VERSION))); - qDebug("Download tab built"); -} - -DownloadingTorrents::~DownloadingTorrents() { - saveLastSortedColumn(); - saveColWidthDLList(); - saveHiddenColumns(); - delete DLDelegate; - delete proxyModel; - delete DLListModel; -} - -void DownloadingTorrents::enablePriorityColumn(bool enable) { - if(enable) { - downloadList->showColumn(PRIORITY); - } else { - downloadList->hideColumn(PRIORITY); - } -} - -void DownloadingTorrents::notifyTorrentDoubleClicked(const QModelIndex& index) { - unsigned int row = index.row(); - QString hash = getHashFromRow(row); - emit torrentDoubleClicked(hash, false); -} - -unsigned int DownloadingTorrents::getNbTorrentsInList() const { - return nbTorrents; -} - -// Note: do not actually pause the torrent in BT session -void DownloadingTorrents::pauseTorrent(QString hash) { - int row = getRowFromHash(hash); - if(row == -1) - return; - DLListModel->setData(DLListModel->index(row, DLSPEED), QVariant((double)0.0)); - DLListModel->setData(DLListModel->index(row, UPSPEED), QVariant((double)0.0)); - DLListModel->setData(DLListModel->index(row, ETA), QVariant((qlonglong)-1)); - DLListModel->setData(DLListModel->index(row, NAME), QIcon(QString::fromUtf8(":/Icons/skin/paused.png")), Qt::DecorationRole); - DLListModel->setData(DLListModel->index(row, SEEDSLEECH), QVariant(QString::fromUtf8("0/0"))); - QTorrentHandle h = BTSession->getTorrentHandle(hash); - //DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress())); - setRowColor(row, QString::fromUtf8("red")); -} - -QString DownloadingTorrents::getHashFromRow(unsigned int row) const { - Q_ASSERT(row < (unsigned int)proxyModel->rowCount()); - return proxyModel->data(proxyModel->index(row, HASH)).toString(); -} - -// Show torrent properties dialog -void DownloadingTorrents::showProperties(const QModelIndex &index) { - showPropertiesFromHash(getHashFromRow(index.row())); -} - -void DownloadingTorrents::showPropertiesFromHash(QString hash) { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(h.is_valid() && h.has_metadata()) { - properties *prop = new properties(this, BTSession, h); - connect(prop, SIGNAL(filteredFilesChanged(QString)), this, SLOT(updateFileSizeAndProgress(QString))); - connect(prop, SIGNAL(trackersChanged(QString)), BTSession, SLOT(saveTrackerFile(QString))); - prop->show(); - } -} - -// Remove a torrent from the download list but NOT from the BT Session -void DownloadingTorrents::deleteTorrent(QString hash) { - int row = getRowFromHash(hash); - if(row == -1){ - qDebug("torrent is not in download list, nothing to delete"); - return; - } - // Select item just under (or above nothing under) the one that was deleted - QModelIndex current_prox_index = proxyModel->mapFromSource(DLListModel->index(row, 0, downloadList->rootIndex())); - bool was_selected = downloadList->selectionModel()->isSelected(current_prox_index); - if(DLListModel->rowCount() > 1 && was_selected) { - QModelIndex under_prox_index; - if(current_prox_index.row() == DLListModel->rowCount()-1) - under_prox_index = proxyModel->index(current_prox_index.row()-1, 0); - else - under_prox_index = proxyModel->index(current_prox_index.row()+1, 0); - //downloadList->selectionModel()->select(under_prox_index, QItemSelectionModel::Current|QItemSelectionModel::Columns|QItemSelectionModel::Select); - downloadList->setCurrentIndex(under_prox_index); - downloadList->update(); - } - // Actually delete the row - DLListModel->removeRow(row); - --nbTorrents; - emit unfinishedTorrentsNumberChanged(nbTorrents); -} - -void DownloadingTorrents::on_actionSet_download_limit_triggered() { - QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); - QStringList hashes; - foreach(const QModelIndex &index, selectedIndexes) { - if(index.column() == NAME) { - // Get the file hash - hashes << getHashFromRow(index.row()); - } - } - Q_ASSERT(hashes.size() > 0); - new BandwidthAllocationDialog(this, false, BTSession, hashes); -} - -void DownloadingTorrents::on_actionSet_upload_limit_triggered() { - QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); - QStringList hashes; - foreach(const QModelIndex &index, selectedIndexes) { - if(index.column() == NAME) { - // Get the file hash - hashes << getHashFromRow(index.row()); - } - } - Q_ASSERT(hashes.size() > 0); - new BandwidthAllocationDialog(this, true, BTSession, hashes); -} - -// display properties of selected items -void DownloadingTorrents::propertiesSelection(){ - QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == NAME){ - showProperties(index); - } - } -} - -void DownloadingTorrents::forceRecheck() { - QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == NAME){ - QString hash = getHashFromRow(index.row()); - QTorrentHandle h = BTSession->getTorrentHandle(hash); - if(h.is_valid() && h.has_metadata()) - h.force_recheck(); - } - } -} - -void DownloadingTorrents::displayDLListMenu(const QPoint&) { - QMenu myDLLlistMenu(this); - // Enable/disable pause/start action given the DL state - QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); - 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) { - if(index.column() == NAME) { - // Get the file name - QString hash = getHashFromRow(index.row()); - // Get handle and pause the torrent - h = BTSession->getTorrentHandle(hash); - if(!h.is_valid()) continue; - if(h.has_metadata()) { - one_has_metadata = true; - } - if(h.is_paused()) { - if(!has_start) { - myDLLlistMenu.addAction(actionStart); - has_start = true; - } - }else{ - if(!has_pause) { - myDLLlistMenu.addAction(actionPause); - has_pause = true; - } - } - if(h.has_metadata() && BTSession->isFilePreviewPossible(hash) && !has_preview) { - myDLLlistMenu.addAction(actionPreview_file); - has_preview = true; - } - if(has_pause && has_start && has_preview) break; - } - } - myDLLlistMenu.addSeparator(); - myDLLlistMenu.addAction(actionDelete); - myDLLlistMenu.addAction(actionDelete_Permanently); - myDLLlistMenu.addSeparator(); - myDLLlistMenu.addAction(actionSet_download_limit); - myDLLlistMenu.addAction(actionSet_upload_limit); - myDLLlistMenu.addSeparator(); - if(one_has_metadata) { - myDLLlistMenu.addAction(actionForce_recheck); - myDLLlistMenu.addSeparator(); - } - myDLLlistMenu.addAction(actionOpen_destination_folder); - if(one_has_metadata) - myDLLlistMenu.addAction(actionTorrent_Properties); - if(BTSession->isQueueingEnabled()) { - myDLLlistMenu.addSeparator(); - myDLLlistMenu.addAction(actionIncreasePriority); - myDLLlistMenu.addAction(actionDecreasePriority); - } - myDLLlistMenu.addSeparator(); - myDLLlistMenu.addAction(actionCopy_magnet_link); - myDLLlistMenu.addAction(actionBuy_it); - // Call menu - myDLLlistMenu.exec(QCursor::pos()); -} - - -/* - * Hiding Columns functions - */ - -// hide/show columns menu -void DownloadingTorrents::displayDLHoSMenu(const QPoint&){ - QMenu hideshowColumn(this); - hideshowColumn.setTitle(tr("Hide or Show Column")); - int lastCol; - if(BTSession->isQueueingEnabled()) { - lastCol = PRIORITY; - } else { - lastCol = ETA; - } - for(int i=0; i <= lastCol; ++i) { - hideshowColumn.addAction(getActionHoSCol(i)); - } - // Call menu - hideshowColumn.exec(QCursor::pos()); -} - -// toggle hide/show a column -void DownloadingTorrents::hideOrShowColumn(int index) { - unsigned int nbVisibleColumns = 0; - unsigned int nbCols = DLListModel->columnCount(); - // Count visible columns - for(unsigned int i=0; iisColumnHidden(i)) - ++nbVisibleColumns; - } - if(!downloadList->isColumnHidden(index)) { - // User wants to hide the column - // Is there at least one other visible column? - if(nbVisibleColumns <= 1) return; - // User can hide the column, do it. - downloadList->setColumnHidden(index, true); - getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); - --nbVisibleColumns; - } else { - // User want to display the column - downloadList->setColumnHidden(index, false); - getActionHoSCol(index)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); - ++nbVisibleColumns; - } - //resize all others non-hidden columns - for(unsigned int i=0; iisColumnHidden(i)) { - downloadList->setColumnWidth(i, (int)ceil(downloadList->columnWidth(i)+(downloadList->columnWidth(index)/nbVisibleColumns))); - } - } -} - -// save the hidden columns in settings -void DownloadingTorrents::saveHiddenColumns() { - QSettings settings("qBittorrent", "qBittorrent"); - QStringList ishidden_list; - short nbColumns = DLListModel->columnCount()-1; - - for(short i=0; iisColumnHidden(i)) { - ishidden_list << QString::fromUtf8(misc::toString(0).c_str()); - } else { - ishidden_list << QString::fromUtf8(misc::toString(1).c_str()); - } - } - settings.setValue("DownloadListColsHoS", ishidden_list.join(" ")); -} - -// load the previous settings, and hide the columns -bool DownloadingTorrents::loadHiddenColumns() { - bool loaded = false; - QSettings settings("qBittorrent", "qBittorrent"); - QString line = settings.value("DownloadListColsHoS", QString()).toString(); - QStringList ishidden_list; - if(!line.isEmpty()) { - ishidden_list = line.split(' '); - if(ishidden_list.size() == DLListModel->columnCount()-1) { - unsigned int listSize = ishidden_list.size(); - for(unsigned int i=0; iheader()->resizeSection(i, ishidden_list.at(i).toInt()); - } - loaded = true; - } - } - for(int i=0; icolumnCount()-1; i++) { - if(loaded && ishidden_list.at(i) == "0") { - downloadList->setColumnHidden(i, true); - getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_cancel.png"))); - } else { - getActionHoSCol(i)->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/button_ok.png"))); - } - } - return loaded; -} - -void DownloadingTorrents::hideOrShowColumnName() { - hideOrShowColumn(NAME); -} - -void DownloadingTorrents::hideOrShowColumnSize() { - hideOrShowColumn(SIZE); -} - -void DownloadingTorrents::hideOrShowColumnProgress() { - hideOrShowColumn(PROGRESS); -} - -void DownloadingTorrents::hideOrShowColumnDownSpeed() { - hideOrShowColumn(DLSPEED); -} - -void DownloadingTorrents::hideOrShowColumnUpSpeed() { - hideOrShowColumn(UPSPEED); -} - -void DownloadingTorrents::hideOrShowColumnSeedersLeechers() { - hideOrShowColumn(SEEDSLEECH); -} - -void DownloadingTorrents::hideOrShowColumnRatio() { - hideOrShowColumn(RATIO); -} - -void DownloadingTorrents::hideOrShowColumnEta() { - hideOrShowColumn(ETA); -} - -void DownloadingTorrents::hideOrShowColumnPriority() { - hideOrShowColumn(PRIORITY); -} - -// getter, return the action hide or show whose id is index -QAction* DownloadingTorrents::getActionHoSCol(int index) { - switch(index) { - case NAME : - return actionHOSColName; - break; - case SIZE : - return actionHOSColSize; - break; - case PROGRESS : - return actionHOSColProgress; - break; - case DLSPEED : - return actionHOSColDownSpeed; - break; - case UPSPEED : - return actionHOSColUpSpeed; - break; - case SEEDSLEECH : - return actionHOSColSeedersLeechers; - break; - case RATIO : - return actionHOSColRatio; - break; - case ETA : - return actionHOSColEta; - break; - case PRIORITY : - return actionHOSColPriority; - break; - default : - return NULL; -} -} - -QStringList DownloadingTorrents::getSelectedTorrents(bool only_one) const{ - QStringList res; - QModelIndexList selectedIndexes = downloadList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes) { - if(index.column() == NAME) { - // Get the file hash - QString hash = getHashFromRow(index.row()); - res << hash; - if(only_one) break; - } - } - 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 -// update download list accordingly -bool DownloadingTorrents::updateTorrent(QTorrentHandle h) { - if(!h.is_valid()) return false; - bool added = false; - try{ - QString hash = h.hash(); - int row = getRowFromHash(hash); - if(row == -1) { - qDebug("Info: Could not find filename in download list, adding it..."); - addTorrent(hash); - row = getRowFromHash(hash); - added = true; - } - Q_ASSERT(row != -1); - // Update Priority - if(BTSession->isQueueingEnabled()) { - DLListModel->setData(DLListModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash))); - if(h.is_queued()) { - 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/oxygen/time.png"))), Qt::DecorationRole); - if(!downloadList->isColumnHidden(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; - } - } - 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: - case torrent_status::checking_resume_data: - 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)) { - 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)) { - 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) { - QTorrentHandle h = BTSession->getTorrentHandle(hash); - int row = getRowFromHash(hash); - qDebug("DL: addTorrent(): %s, row: %d", (const char*)hash.toLocal8Bit(), row); - if(row != -1) return; - row = DLListModel->rowCount(); - // Adding torrent to download list - DLListModel->insertRow(row); - DLListModel->setData(DLListModel->index(row, NAME), QVariant(h.name())); - DLListModel->setData(DLListModel->index(row, SIZE), QVariant((qlonglong)h.actual_size())); - 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(QString::fromUtf8("0/0"))); - 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)); - if(BTSession->isQueueingEnabled()) - DLListModel->setData(DLListModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(hash))); - DLListModel->setData(DLListModel->index(row, HASH), QVariant(hash)); - // Pause torrent if it is - if(h.is_paused()) { - DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/paused.png"))), Qt::DecorationRole); - setRowColor(row, QString::fromUtf8("red")); - }else{ - DLListModel->setData(DLListModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/stalled.png"))), Qt::DecorationRole); - setRowColor(row, QString::fromUtf8("grey")); - } - ++nbTorrents; - emit unfinishedTorrentsNumberChanged(nbTorrents); -} - -// Save columns width in a file to remember them -// (download list) -void DownloadingTorrents::saveColWidthDLList() const{ - qDebug("Saving columns width in download list"); - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - QStringList width_list; - QStringList new_width_list; - short nbColumns = DLListModel->columnCount()-1; - QString line = settings.value("DownloadListColsWidth", QString()).toString(); - if(!line.isEmpty()) { - width_list = line.split(' '); - } - for(short i=0; icolumnWidth(i)<1 && width_list.size() == nbColumns && width_list.at(i).toInt()>=1) { - // load the former width - new_width_list << width_list.at(i); - } else if(downloadList->columnWidth(i)>=1) { - // usual case, save the current width - new_width_list << QString::fromUtf8(misc::toString(downloadList->columnWidth(i)).c_str()); - } else { - // default width - downloadList->resizeColumnToContents(i); - new_width_list << QString::fromUtf8(misc::toString(downloadList->columnWidth(i)).c_str()); - } - } - settings.setValue(QString::fromUtf8("DownloadListColsWidth"), new_width_list.join(QString::fromUtf8(" "))); - QVariantList visualIndexes; - for(int i=0; iheader()->visualIndex(i)); - } - settings.setValue(QString::fromUtf8("DownloadListVisualIndexes"), visualIndexes); - qDebug("Download list columns width saved"); -} - -// Load columns width in a file that were saved previously -// (download list) -bool DownloadingTorrents::loadColWidthDLList() { - qDebug("Loading columns width for download list"); - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - QString line = settings.value(QString::fromUtf8("DownloadListColsWidth"), QString()).toString(); - if(line.isEmpty()) - return false; - QStringList width_list = line.split(QString::fromUtf8(" ")); - if(width_list.size() != DLListModel->columnCount()-1) { - qDebug("Corrupted values for download list columns sizes"); - return false; - } - unsigned int listSize = width_list.size(); - for(unsigned int i=0; iheader()->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;iheader()->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"); - return true; -} - -void DownloadingTorrents::saveLastSortedColumn() { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - Qt::SortOrder sortOrder = downloadList->header()->sortIndicatorOrder(); - QString sortOrderLetter; - if(sortOrder == Qt::AscendingOrder) - sortOrderLetter = QString::fromUtf8("a"); - else - sortOrderLetter = QString::fromUtf8("d"); - int index = downloadList->header()->sortIndicatorSection(); - settings.setValue(QString::fromUtf8("DownloadListSortedCol"), misc::toQString(index)+sortOrderLetter); -} - -void DownloadingTorrents::loadLastSortedColumn() { - // Loading last sorted column - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - QString sortedCol = settings.value(QString::fromUtf8("DownloadListSortedCol"), QString()).toString(); - if(!sortedCol.isEmpty()) { - Qt::SortOrder sortOrder; - if(sortedCol.endsWith(QString::fromUtf8("d"))) - sortOrder = Qt::DescendingOrder; - else - sortOrder = Qt::AscendingOrder; - sortedCol = sortedCol.left(sortedCol.size()-1); - int index = sortedCol.toInt(); - downloadList->sortByColumn(index, sortOrder); - } -} - -void DownloadingTorrents::updateFileSizeAndProgress(QString hash) { - int row = getRowFromHash(hash); - Q_ASSERT(row != -1); - QTorrentHandle h = BTSession->getTorrentHandle(hash); - DLListModel->setData(DLListModel->index(row, SIZE), QVariant((qlonglong)h.actual_size())); - //DLListModel->setData(DLListModel->index(row, PROGRESS), QVariant((double)h.progress())); -} - -// Set the color of a row in data model -void DownloadingTorrents::setRowColor(int row, QColor color) { - unsigned int nbColumns = DLListModel->columnCount()-1; - for(unsigned int i=0; isetData(DLListModel->index(row, i), QVariant(color), Qt::ForegroundRole); - } -} - -// return the row of in data model -// corresponding to the given the hash -int DownloadingTorrents::getRowFromHash(QString hash) const{ - unsigned int nbRows = DLListModel->rowCount(); - for(unsigned int i=0; idata(DLListModel->index(i, HASH)) == hash) { - return i; - } - } - return -1; -} - - diff --git a/src/downloadingTorrents.h b/src/downloadingTorrents.h deleted file mode 100644 index 7acaa9ac3..000000000 --- a/src/downloadingTorrents.h +++ /dev/null @@ -1,107 +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 DOWNLOADINGTORRENTS_H -#define DOWNLOADINGTORRENTS_H - -#include "ui_download.h" -#include "qtorrenthandle.h" - -class QStandardItemModel; -class bittorrent; -class DLListDelegate; -class QSortFilterProxyModel; - -using namespace libtorrent; - -class DownloadingTorrents : public QWidget, public Ui::downloading{ - Q_OBJECT - private: - QObject *parent; - bittorrent *BTSession; - DLListDelegate *DLDelegate; - QStandardItemModel *DLListModel; - QSortFilterProxyModel *proxyModel; - unsigned int nbTorrents; - void hideOrShowColumn(int index); - bool loadHiddenColumns(); - void saveHiddenColumns(); - QAction* getActionHoSCol(int index); - - public: - DownloadingTorrents(QObject *parent, bittorrent *BTSession); - ~DownloadingTorrents(); - // Methods - bool loadColWidthDLList(); - int getRowFromHash(QString hash) const; - QString getHashFromRow(unsigned int row) const; - QStringList getSelectedTorrents(bool only_one=false) const; - unsigned int getNbTorrentsInList() const; - void enablePriorityColumn(bool enable); - - signals: - void unfinishedTorrentsNumberChanged(unsigned int); - void torrentDoubleClicked(QString hash, bool finished); - - protected slots: - void on_actionSet_download_limit_triggered(); - void notifyTorrentDoubleClicked(const QModelIndex& index); - void on_actionSet_upload_limit_triggered(); - void displayDLListMenu(const QPoint& pos); - void displayDLHoSMenu(const QPoint&); - void saveColWidthDLList() const; - void setRowColor(int row, QColor color); - void showProperties(const QModelIndex &index); - void hideOrShowColumnName(); - void hideOrShowColumnSize(); - void hideOrShowColumnProgress(); - void hideOrShowColumnDownSpeed(); - void hideOrShowColumnUpSpeed(); - void hideOrShowColumnSeedersLeechers(); - void hideOrShowColumnRatio(); - void hideOrShowColumnEta(); - void hideOrShowColumnPriority(); - void forceRecheck(); - - public slots: - bool updateTorrent(QTorrentHandle h); - void pauseTorrent(QString hash); - void deleteTorrent(QString hash); - void propertiesSelection(); - void updateFileSizeAndProgress(QString hash); - void showPropertiesFromHash(QString hash); - void saveLastSortedColumn(); - void loadLastSortedColumn(); - void addTorrent(QString hash); - void updateMetadata(QTorrentHandle &h); - -}; - -#endif diff --git a/src/icons.qrc b/src/icons.qrc index 8f25c7f4f..dbe10243d 100644 --- a/src/icons.qrc +++ b/src/icons.qrc @@ -35,7 +35,6 @@ Icons/skin/info.png Icons/skin/tabs.gif Icons/skin/delete_perm.png - Icons/skin/queued.png Icons/skin/settings.png Icons/skin/exit.png Icons/skin/delete_all.png @@ -72,7 +71,6 @@ Icons/oxygen/view-refresh.png Icons/oxygen/file.png Icons/oxygen/mail-folder-inbox.png - Icons/oxygen/time.png Icons/oxygen/edit-find.png Icons/oxygen/folder-new.png Icons/oxygen/folder-remote.png diff --git a/src/src.pro b/src/src.pro index f6ba38b57..c8b9dbd86 100644 --- a/src/src.pro +++ b/src/src.pro @@ -145,7 +145,6 @@ HEADERS += GUI.h \ about_imp.h \ properties_imp.h \ createtorrent_imp.h \ - DLListDelegate.h \ SearchListDelegate.h \ PropListDelegate.h \ previewSelect.h \ @@ -158,11 +157,8 @@ HEADERS += GUI.h \ searchEngine.h \ rss.h \ rss_imp.h \ - FinishedTorrents.h \ allocationDlg.h \ - FinishedListDelegate.h \ qtorrenthandle.h \ - downloadingTorrents.h \ engineSelectDlg.h \ pluginSource.h \ arborescence.h \ @@ -187,7 +183,8 @@ HEADERS += GUI.h \ feedList.h \ supportedEngines.h \ TransferListWidget.h \ - TransferListDelegate.h + TransferListDelegate.h \ + TransferListFiltersWidget.h FORMS += MainWindow.ui \ options.ui \ about.ui \ @@ -201,7 +198,6 @@ FORMS += MainWindow.ui \ rss.ui \ seeding.ui \ bandwidth_limit.ui \ - download.ui \ engineSelect.ui \ pluginSource.ui \ trackersAdd.ui \ @@ -215,9 +211,7 @@ SOURCES += GUI.cpp \ bittorrent.cpp \ searchEngine.cpp \ rss_imp.cpp \ - FinishedTorrents.cpp \ qtorrenthandle.cpp \ - downloadingTorrents.cpp \ engineSelectDlg.cpp \ downloadThread.cpp \ realprogressbar.cpp \ diff --git a/src/webui/scripts/client.js b/src/webui/scripts/client.js index 5b07e2b14..dd119fb94 100644 --- a/src/webui/scripts/client.js +++ b/src/webui/scripts/client.js @@ -49,13 +49,13 @@ window.addEvent('domready', function(){ case 'seeding': return ''; case 'checking': - return ''; + return ''; case 'downloading': return ''; case 'stalled': return ''; case 'queued': - return ''; + return ''; default: return ''; } From 2dddd2b24bb0b06ecc598fa56f465a1ccd4f5519 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 12:05:35 +0000 Subject: [PATCH 14/34] - Started work on transfer list filters --- src/GUI.cpp | 23 ++++++++++++++++++----- src/GUI.h | 4 ++++ src/Icons/oxygen/draw-rectangle.png | Bin 0 -> 389 bytes src/Icons/oxygen/draw-triangle2.png | Bin 0 -> 670 bytes src/Icons/oxygen/folder-remote16.png | Bin 0 -> 675 bytes src/TransferListFiltersWidget.h | 26 ++++++++++++++++++++++++++ src/icons.qrc | 3 +++ 7 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 src/Icons/oxygen/draw-rectangle.png create mode 100644 src/Icons/oxygen/draw-triangle2.png create mode 100644 src/Icons/oxygen/folder-remote16.png diff --git a/src/GUI.cpp b/src/GUI.cpp index 8ce15deb8..dc4d7848b 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -62,6 +62,7 @@ #include "console_imp.h" #include "httpserver.h" #include "torrentPersistentData.h" +#include "TransferListFiltersWidget.h" using namespace libtorrent; @@ -135,10 +136,16 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis qDebug("create tabWidget"); tabs = new QTabWidget(); + vSplitter = new QSplitter(Qt::Horizontal); + // Transfer List tab - transferList = new TransferListWidget(tabs, BTSession); - int index_tab = tabs->addTab(transferList, tr("Transfers")); - tabs->setTabIcon(index_tab, QIcon(QString::fromUtf8(":/Icons/oxygen/folder-remote.png"))); + transferListFilters = new TransferListFiltersWidget(vSplitter); + vSplitter->addWidget(transferListFilters); + transferList = new TransferListWidget(vSplitter, BTSession); + vSplitter->addWidget(transferList); + + tabs->addTab(vSplitter, QIcon(QString::fromUtf8(":/Icons/oxygen/folder-remote.png")), tr("Transfers")); + vboxLayout->addWidget(tabs); // Transfer list slots @@ -155,8 +162,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis //connect(downloadingTorrentTab, SIGNAL(torrentDoubleClicked(QString, bool)), this, SLOT(torrentDoubleClicked(QString, bool))); // Search engine tab searchEngine = new SearchEngine(BTSession, myTrayIcon, systrayIntegration); - index_tab = tabs->addTab(searchEngine, tr("Search")); - tabs->setTabIcon(index_tab, QIcon(QString::fromUtf8(":/Icons/oxygen/edit-find.png"))); + tabs->addTab(searchEngine, QIcon(QString::fromUtf8(":/Icons/oxygen/edit-find.png")), tr("Search")); readSettings(); // RSS Tab rssWidget = 0; @@ -233,6 +239,11 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis if(settings.value(QString::fromUtf8("Preferences/General/StartMinimized"), false).toBool()) { this->setWindowState(Qt::WindowMinimized); } + // Splitter size + QList sizes; + sizes << 120; + sizes << vSplitter->width()-120; + vSplitter->setSizes(sizes); scrapeTimer = new QTimer(this); connect(scrapeTimer, SIGNAL(timeout()), this, SLOT(scrapeTrackers())); scrapeTimer->start(20000); @@ -260,7 +271,9 @@ GUI::~GUI() { if(rssWidget != 0) delete rssWidget; delete searchEngine; + delete transferListFilters; delete transferList; + delete vSplitter; delete checkConnect; qDebug("1"); if(systrayCreator) { diff --git a/src/GUI.h b/src/GUI.h index 59fd72069..1cc7dee8d 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -56,6 +56,8 @@ class QModelIndex; class HttpServer; class QFrame; class TransferListWidget; +class TransferListFiltersWidget; +class QSplitter; class GUI : public QMainWindow, private Ui::MainWindow{ Q_OBJECT @@ -73,6 +75,8 @@ class GUI : public QMainWindow, private Ui::MainWindow{ QPointer systrayCreator; QMenu *myTrayIconMenu; TransferListWidget *transferList; + TransferListFiltersWidget *transferListFilters; + QSplitter *vSplitter; QLabel *connecStatusLblIcon; bool systrayIntegration; bool displaySpeedInTitle; diff --git a/src/Icons/oxygen/draw-rectangle.png b/src/Icons/oxygen/draw-rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..04e0937703be74e58472ea85b539aad47debd8ab GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf4nJ zFzyCnMyofE9{~j=OI#yLg7ec#$`gxH8OqDc^)mCai<1)zQuXqS(r3T3kpik_@^oUEu{EW{S6Ch*+7Oj3uAnp}Xxiy_d<85^?#^ot$?mP3CpgiL;f8}timQ}M} zY0?h=z8h`|2~}0v#&>P{wZLniJ0kAr2o~+=-`KyYY|>sAmZLuAu5XjCM2Wwyo~fz& zSv`gSN4Bv&!)>Ob8^xEJ|1fgTe~DWM4fD7u`t literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/draw-triangle2.png b/src/Icons/oxygen/draw-triangle2.png new file mode 100644 index 0000000000000000000000000000000000000000..3c29299bb163e1ead6e00e720c96ebd9fee79f2e GIT binary patch literal 670 zcmV;P0%84$P)qr00)Nk$$@OWQ0gMT`*7Wy%U& zjKIBh>R1Hb?B1nFL>piHTVI9sq&07Ik$8(b?G^YHB)qiU>24lQScp7dyNwfSF;fg|!w94M(WE z`+TUe@mRz;c{x5lb#s1xzUrR<5y4suW`=W)g2A9|X*m(->gwEATf6^8I{ovN=Z*LO z74UsujWH-MYb_aLl!zo03Q9-E*-%^C>3Zj?9(dl9xzSPY%pVE10z?ENf~xxEYt`2u zLQl_yP;>L~HfHm5Z0zw}0N~9jfSDm8P*td^5)nj1%b=?MKG7JcLWxYV0yxKT&Ot=r z`#wYj0Mr^}X4PE=N1*lSHhN{9C0}+9UsH!59$s(D2mt9*+ zX9@-XPBeP;`PN5d0AS|I6s)!IeP8qW0+yFQmR43i6#+aV@<*c4!Q%EQY$kA(4I;wo z>K9#FdYco`1rawqIN1Mnr;k)g008Oqcf{j~Y%aI)SwwFQ3|x-y)VM7H>*C_lMk=+I zS1k?q^<9hs(El}8fIuJ+Utj<68YtfH?Y)%UO=G!!0kJ3Y7?T^G&;S4c07*qoM6N<$ Ef(L6T6#xJL literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/folder-remote16.png b/src/Icons/oxygen/folder-remote16.png new file mode 100644 index 0000000000000000000000000000000000000000..38465e5738143ad49e1ddd648e5bd9d53ca0b8a3 GIT binary patch literal 675 zcmV;U0$lxxP)FUgxb-}fCPPQm(t z@AiD2`|>_Vf*`>EKxgK++kA(H9t@4FdY$0r(u0v7=mWX-=o@=@BcZAafj|^m-fFU? z&qwI`pnV%~LD@g-f)M;+)Yd5v`tkU!1Ij&;TXb*|2oF^hAUhq$NqDhR;|oOh0N5yc z_!lP68sM&IKtL40GF5OS;%~1WCmrdE`wyrJZvcrEis8ejP2S)b5i^4Ew1o?{h7bjsu8rsKzKgcf5w5}m zLsMWGs!Uj8m>x^PZ83OlhT1_34cABYFhK2>2hWF?la6rZBO1EG1BtU=MRF*O+}#;$ zY!&%R0!k&vQKsb^zdankGa_^AWVZARFHeU21}=Cw!4_U zG=-ne0R~O_*UyyZNr{CJP=k)&TX=c>Y9>;5d=&X9kJ}xXx(>_K8?WwX=7M&U0q}Wt ziBNbn^l~~wr|vv`6E15Jke)p(Utu8JyhkPdX;%OM002ov JPDHLkV1fmBD#8E& literal 0 HcmV?d00001 diff --git a/src/TransferListFiltersWidget.h b/src/TransferListFiltersWidget.h index daed7e157..db05a423f 100644 --- a/src/TransferListFiltersWidget.h +++ b/src/TransferListFiltersWidget.h @@ -1,4 +1,30 @@ #ifndef TRANSFERLISTFILTERSWIDGET_H #define TRANSFERLISTFILTERSWIDGET_H +#include +#include +#include + +class TransferListFiltersWidget: public QListWidget { +public: + TransferListFiltersWidget(QWidget *parent): QListWidget(parent) { + // Add filters + QListWidgetItem *all = new QListWidgetItem(this); + all->setData(Qt::DisplayRole, tr("All")); + all->setData(Qt::DecorationRole, QIcon(":/Icons/oxygen/folder-remote16.png")); + QListWidgetItem *downloading = new QListWidgetItem(this); + downloading->setData(Qt::DisplayRole, tr("Downloading")); + downloading->setData(Qt::DecorationRole, QIcon(":/Icons/skin/downloading.png")); + QListWidgetItem *completed = new QListWidgetItem(this); + completed->setData(Qt::DisplayRole, tr("Completed")); + completed->setData(Qt::DecorationRole, QIcon(":/Icons/skin/seeding.png")); + QListWidgetItem *active = new QListWidgetItem(this); + active->setData(Qt::DisplayRole, tr("Active")); + active->setData(Qt::DecorationRole, QIcon(":/Icons/oxygen/draw-triangle2.png")); + QListWidgetItem *inactive = new QListWidgetItem(this); + inactive->setData(Qt::DisplayRole, tr("Inactive")); + inactive->setData(Qt::DecorationRole, QIcon(":/Icons/oxygen/draw-rectangle.png")); + } +}; + #endif // TRANSFERLISTFILTERSWIDGET_H diff --git a/src/icons.qrc b/src/icons.qrc index dbe10243d..e014c332b 100644 --- a/src/icons.qrc +++ b/src/icons.qrc @@ -70,6 +70,7 @@ Icons/oxygen/mail-queue.png Icons/oxygen/view-refresh.png Icons/oxygen/file.png + Icons/oxygen/folder-remote16.png Icons/oxygen/mail-folder-inbox.png Icons/oxygen/edit-find.png Icons/oxygen/folder-new.png @@ -88,6 +89,7 @@ Icons/oxygen/download.png Icons/oxygen/application-x-kgetlist-no.png Icons/oxygen/gear.png + Icons/oxygen/draw-triangle2.png Icons/oxygen/remove.png Icons/oxygen/browse.png Icons/oxygen/unsubscribe16.png @@ -107,6 +109,7 @@ Icons/oxygen/folder.png Icons/oxygen/edit-cut.png Icons/oxygen/unsubscribe.png + Icons/oxygen/draw-rectangle.png Icons/oxygen/subscribe16.png \ No newline at end of file From 6b6181a3ee44cee35b69c045ebae31d7346a7f17 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 12:23:04 +0000 Subject: [PATCH 15/34] - vertical splitter size is now restored on startup --- src/GUI.cpp | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/GUI.cpp b/src/GUI.cpp index dc4d7848b..94f29925f 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -163,7 +163,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis // Search engine tab searchEngine = new SearchEngine(BTSession, myTrayIcon, systrayIntegration); tabs->addTab(searchEngine, QIcon(QString::fromUtf8(":/Icons/oxygen/edit-find.png")), tr("Search")); - readSettings(); + // RSS Tab rssWidget = 0; @@ -235,15 +235,16 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis QMainWindow::statusBar()->addPermanentWidget(upSpeedLbl); QMainWindow::statusBar()->addPermanentWidget(statusSep4); QMainWindow::statusBar()->addPermanentWidget(ratioLbl); + show(); + + // Load Window state and sizes + readSettings(); + if(settings.value(QString::fromUtf8("Preferences/General/StartMinimized"), false).toBool()) { this->setWindowState(Qt::WindowMinimized); } - // Splitter size - QList sizes; - sizes << 120; - sizes << vSplitter->width()-120; - vSplitter->setSizes(sizes); + scrapeTimer = new QTimer(this); connect(scrapeTimer, SIGNAL(timeout()), this, SLOT(scrapeTrackers())); scrapeTimer->start(20000); @@ -365,6 +366,11 @@ void GUI::writeSettings() { settings.beginGroup(QString::fromUtf8("MainWindow")); settings.setValue(QString::fromUtf8("size"), size()); settings.setValue(QString::fromUtf8("pos"), pos()); + // Splitter size + QStringList sizes_str; + sizes_str << QString::number(vSplitter->sizes().first()); + sizes_str << QString::number(vSplitter->sizes().last()); + settings.setValue(QString::fromUtf8("vSplitterSizes"), sizes_str); settings.endGroup(); } @@ -436,6 +442,18 @@ void GUI::readSettings() { settings.beginGroup(QString::fromUtf8("MainWindow")); resize(settings.value(QString::fromUtf8("size"), size()).toSize()); move(settings.value(QString::fromUtf8("pos"), screenCenter()).toPoint()); + QStringList sizes_str = settings.value("vSplitterSizes", QStringList()).toStringList(); + // Splitter size + QList sizes; + if(sizes_str.size() == 2) { + sizes << sizes_str.first().toInt(); + sizes << sizes_str.last().toInt(); + } else { + qDebug("Default splitter size"); + sizes << 120; + sizes << vSplitter->width()-120; + } + vSplitter->setSizes(sizes); settings.endGroup(); } From a0beccc04bc01073ac5993441af6571a13ba5a29 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 12:35:12 +0000 Subject: [PATCH 16/34] - Selected filter is now restored on startup --- src/GUI.cpp | 6 +++--- src/TransferListFiltersWidget.h | 28 +++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/GUI.cpp b/src/GUI.cpp index 94f29925f..fe4b0ec40 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -139,11 +139,11 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis vSplitter = new QSplitter(Qt::Horizontal); // Transfer List tab - transferListFilters = new TransferListFiltersWidget(vSplitter); - vSplitter->addWidget(transferListFilters); transferList = new TransferListWidget(vSplitter, BTSession); - vSplitter->addWidget(transferList); + transferListFilters = new TransferListFiltersWidget(vSplitter, transferList); + vSplitter->addWidget(transferListFilters); + vSplitter->addWidget(transferList); tabs->addTab(vSplitter, QIcon(QString::fromUtf8(":/Icons/oxygen/folder-remote.png")), tr("Transfers")); vboxLayout->addWidget(tabs); diff --git a/src/TransferListFiltersWidget.h b/src/TransferListFiltersWidget.h index db05a423f..746f9c714 100644 --- a/src/TransferListFiltersWidget.h +++ b/src/TransferListFiltersWidget.h @@ -4,10 +4,17 @@ #include #include #include +#include + +#include "TransferListWidget.h" class TransferListFiltersWidget: public QListWidget { + +private: + TransferListWidget *transferList; + public: - TransferListFiltersWidget(QWidget *parent): QListWidget(parent) { + TransferListFiltersWidget(QWidget *parent, TransferListWidget *transferList): QListWidget(parent), transferList(transferList) { // Add filters QListWidgetItem *all = new QListWidgetItem(this); all->setData(Qt::DisplayRole, tr("All")); @@ -24,7 +31,26 @@ public: QListWidgetItem *inactive = new QListWidgetItem(this); inactive->setData(Qt::DisplayRole, tr("Inactive")); inactive->setData(Qt::DecorationRole, QIcon(":/Icons/oxygen/draw-rectangle.png")); + // Load settings + loadSettings(); + } + + ~TransferListFiltersWidget() { + saveSettings(); } + + void saveSettings() const { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.beginGroup(QString::fromUtf8("TransferListFilters")); + settings.setValue("selectedFilterIndex", QVariant(currentRow())); + } + + void loadSettings() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.beginGroup(QString::fromUtf8("TransferListFilters")); + setCurrentRow(settings.value("selectedFilterIndex", 0).toInt()); + } + }; #endif // TRANSFERLISTFILTERSWIDGET_H From 6b8521355fbed074dc817b8ac7e326ae6d8a4288 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 13:19:00 +0000 Subject: [PATCH 17/34] - Managed to get the transfer list filters working :) --- src/TransferListDelegate.h | 11 +------- src/TransferListFiltersWidget.h | 4 +++ src/TransferListWidget.cpp | 50 +++++++++++++++++++++++++++------ src/TransferListWidget.h | 3 ++ 4 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/TransferListDelegate.h b/src/TransferListDelegate.h index 4f9810f23..8f386a04e 100644 --- a/src/TransferListDelegate.h +++ b/src/TransferListDelegate.h @@ -40,16 +40,7 @@ #include "misc.h" // Defines for download list list columns -#define NAME 0 -#define SIZE 1 -#define PROGRESS 2 -#define DLSPEED 3 -#define UPSPEED 4 -#define SEEDSLEECH 5 -#define RATIO 6 -#define ETA 7 -#define PRIORITY 8 -#define HASH 9 +enum Column {NAME, SIZE, PROGRESS, DLSPEED, UPSPEED, SEEDSLEECH, RATIO, ETA, PRIORITY, HASH, STATUS}; class TransferListDelegate: public QItemDelegate { Q_OBJECT diff --git a/src/TransferListFiltersWidget.h b/src/TransferListFiltersWidget.h index 746f9c714..bc807025d 100644 --- a/src/TransferListFiltersWidget.h +++ b/src/TransferListFiltersWidget.h @@ -31,6 +31,10 @@ public: QListWidgetItem *inactive = new QListWidgetItem(this); inactive->setData(Qt::DisplayRole, tr("Inactive")); inactive->setData(Qt::DecorationRole, QIcon(":/Icons/oxygen/draw-rectangle.png")); + + // SIGNAL/SLOT + connect(this, SIGNAL(currentRowChanged(int)), transferList, SLOT(applyFilter(int))); + // Load settings loadSettings(); } diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index 2a095b41a..2555d197e 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -44,6 +44,7 @@ #include #include #include +#include #include TransferListWidget::TransferListWidget(QWidget *parent, bittorrent *_BTSession): QTreeView(parent) { @@ -55,7 +56,7 @@ TransferListWidget::TransferListWidget(QWidget *parent, bittorrent *_BTSession): setItemDelegate(listDelegate); // Create transfer list model - listModel = new QStandardItemModel(0,10); + listModel = new QStandardItemModel(0,11); listModel->setHeaderData(NAME, Qt::Horizontal, tr("Name", "i.e: file name")); listModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size", "i.e: file size")); listModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress", "i.e: % downloaded")); @@ -70,6 +71,8 @@ TransferListWidget::TransferListWidget(QWidget *parent, bittorrent *_BTSession): proxyModel = new QSortFilterProxyModel(); proxyModel->setDynamicSortFilter(true); proxyModel->setSourceModel(listModel); + proxyModel->setFilterKeyColumn(STATUS); + proxyModel->setFilterRole(Qt::DisplayRole); setModel(proxyModel); // Visual settings @@ -78,6 +81,7 @@ TransferListWidget::TransferListWidget(QWidget *parent, bittorrent *_BTSession): setSortingEnabled(true); hideColumn(PRIORITY); hideColumn(HASH); + hideColumn(STATUS); loadHiddenColumns(); // Load last columns width for transfer list if(!loadColWidthList()) { @@ -128,9 +132,11 @@ void TransferListWidget::addTorrent(QTorrentHandle& h) { // Pause torrent if it is if(h.is_paused()) { listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/paused.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, STATUS), INACTIVE); //setRowColor(row, QString::fromUtf8("red")); }else{ listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/skin/stalled.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, STATUS), DOWNLOADING); //setRowColor(row, QString::fromUtf8("grey")); } } catch(invalid_handle e) { @@ -140,7 +146,7 @@ void TransferListWidget::addTorrent(QTorrentHandle& h) { } /*void TransferListWidget::setRowColor(int row, QColor color) { - unsigned int nbColumns = listModel->columnCount()-1; + unsigned int nbColumns = listModel->columnCount()-2; for(unsigned int i=0; isetData(listModel->index(row, i), QVariant(color), Qt::ForegroundRole); } @@ -159,6 +165,7 @@ void TransferListWidget::pauseTorrent(int row) { listModel->setData(listModel->index(row, UPSPEED), QVariant((double)0.0)); listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); listModel->setData(listModel->index(row, NAME), QIcon(QString::fromUtf8(":/Icons/skin/paused.png")), Qt::DecorationRole); + listModel->setData(listModel->index(row, STATUS), INACTIVE); listModel->setData(listModel->index(row, SEEDSLEECH), QVariant(QString::fromUtf8("0/0"))); //setRowColor(row, QString::fromUtf8("red")); } @@ -166,8 +173,10 @@ void TransferListWidget::pauseTorrent(int row) { void TransferListWidget::resumeTorrent(int row) { QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(row)); if(!h.is_valid()) return; - if(h.is_seed()) + if(h.is_seed()) { listModel->setData(listModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/seeding.png")), Qt::DecorationRole); + listModel->setData(listModel->index(row, STATUS), COMPLETED); + } updateTorrent(row); } @@ -197,9 +206,11 @@ void TransferListWidget::updateTorrent(int row) { if(h.is_queued()) { if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking) { listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/run-build.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, STATUS), INACTIVE); listModel->setData(listModel->index(row, PROGRESS), QVariant((double)h.progress())); }else { listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/mail-queue.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, STATUS), INACTIVE); listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); } // Reset speeds and seeds/leech @@ -221,6 +232,7 @@ void TransferListWidget::updateTorrent(int row) { case torrent_status::queued_for_checking: case torrent_status::checking_resume_data: listModel->setData(listModel->index(row, NAME), QVariant(QIcon(QString::fromUtf8(":/Icons/oxygen/run-build.png"))), Qt::DecorationRole); + listModel->setData(listModel->index(row, STATUS), INACTIVE); //setRowColor(row, QString::fromUtf8("grey")); break; case torrent_status::downloading: @@ -234,6 +246,7 @@ void TransferListWidget::updateTorrent(int row) { listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); //setRowColor(row, QApplication::palette().color(QPalette::WindowText)); } + listModel->setData(listModel->index(row, STATUS), DOWNLOADING); listModel->setData(listModel->index(row, UPSPEED), QVariant((double)h.upload_payload_rate())); break; default: @@ -265,9 +278,11 @@ void TransferListWidget::setFinished(QTorrentHandle &h) { if(row >= 0) { if(h.is_paused()) { listModel->setData(listModel->index(row, NAME), QIcon(":/Icons/skin/paused.png"), Qt::DecorationRole); + listModel->setData(listModel->index(row, STATUS), INACTIVE); //setRowColor(row, "red"); }else{ listModel->setData(listModel->index(row, NAME), QVariant(QIcon(":/Icons/skin/seeding.png")), Qt::DecorationRole); + listModel->setData(listModel->index(row, STATUS), COMPLETED); //setRowColor(row, "orange"); } listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); @@ -531,7 +546,7 @@ void TransferListWidget::recheckSelectedTorrents() { void TransferListWidget::saveHiddenColumns() { QSettings settings("qBittorrent", "qBittorrent"); QStringList ishidden_list; - short nbColumns = listModel->columnCount()-1; + short nbColumns = listModel->columnCount()-2; for(short i=0; icolumnCount()-1) { + if(nbCol == (unsigned int)listModel->columnCount()-2) { for(unsigned int i=0; icolumnCount()-1; + short nbColumns = listModel->columnCount()-2; QString line = settings.value("TransferListColsWidth", QString()).toString(); if(!line.isEmpty()) { width_list = line.split(' '); @@ -717,7 +732,7 @@ bool TransferListWidget::loadColWidthList() { if(line.isEmpty()) return false; QStringList width_list = line.split(QString::fromUtf8(" ")); - if(width_list.size() != listModel->columnCount()-1) { + if(width_list.size() != listModel->columnCount()-2) { qDebug("Corrupted values for download list columns sizes"); return false; } @@ -726,7 +741,7 @@ bool TransferListWidget::loadColWidthList() { header()->resizeSection(i, width_list.at(i).toInt()); } QVariantList visualIndexes = settings.value(QString::fromUtf8("TransferListVisualIndexes"), QVariantList()).toList(); - if(visualIndexes.size() != listModel->columnCount()-1) { + if(visualIndexes.size() != listModel->columnCount()-2) { qDebug("Corrupted values for download list columns sizes"); return false; } @@ -773,3 +788,22 @@ void TransferListWidget::loadLastSortedColumn() { sortByColumn(index, sortOrder); } } + +void TransferListWidget::applyFilter(int f) { + switch(f) { + case DOWNLOADING: + proxyModel->setFilterRegExp(QRegExp(QString::number(DOWNLOADING), Qt::CaseSensitive, QRegExp::FixedString)); + break; + case COMPLETED: + proxyModel->setFilterRegExp(QRegExp(QString::number(COMPLETED), Qt::CaseSensitive, QRegExp::FixedString)); + break; + case ACTIVE: + proxyModel->setFilterRegExp(QRegExp(QString::number(DOWNLOADING)+"|"+QString::number(COMPLETED), Qt::CaseSensitive)); + break; + case INACTIVE: + proxyModel->setFilterRegExp(QRegExp(QString::number(INACTIVE), Qt::CaseSensitive, QRegExp::FixedString)); + break; + default: + proxyModel->setFilterRegExp(QRegExp()); + } +} diff --git a/src/TransferListWidget.h b/src/TransferListWidget.h index 5d616e09d..474f2bdc4 100644 --- a/src/TransferListWidget.h +++ b/src/TransferListWidget.h @@ -40,6 +40,8 @@ class QSortFilterProxyModel; class bittorrent; class QTimer; +enum TorrentFilter {ALL, DOWNLOADING, COMPLETED, ACTIVE, INACTIVE }; + class TransferListWidget: public QTreeView { Q_OBJECT @@ -97,6 +99,7 @@ public slots: void previewSelectedTorrents(); void hidePriorityColumn(bool hide); void displayDLHoSMenu(const QPoint&); + void applyFilter(int f); }; From 707e87f5b85f8e08809d36f163fec5eb32095651 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 14:20:58 +0000 Subject: [PATCH 18/34] - started work on properties --- src/GUI.cpp | 10 +- src/GUI.h | 3 + src/Icons/oxygen/help-about.png | Bin 0 -> 734 bytes src/Icons/oxygen/network-server.png | Bin 0 -> 491 bytes src/Icons/oxygen/peer.png | Bin 0 -> 409 bytes src/Icons/oxygen/urlseed.png | Bin 0 -> 901 bytes src/icons.qrc | 4 + src/propertiesWidget.ui | 487 ++++++++++++++++++++++++++++ src/propertieswidget.cpp | 39 +++ src/propertieswidget.h | 44 +++ src/src.pro | 9 +- 11 files changed, 591 insertions(+), 5 deletions(-) create mode 100644 src/Icons/oxygen/help-about.png create mode 100644 src/Icons/oxygen/network-server.png create mode 100644 src/Icons/oxygen/peer.png create mode 100644 src/Icons/oxygen/urlseed.png create mode 100644 src/propertiesWidget.ui create mode 100644 src/propertieswidget.cpp create mode 100644 src/propertieswidget.h diff --git a/src/GUI.cpp b/src/GUI.cpp index fe4b0ec40..bef4e3b84 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -63,6 +63,7 @@ #include "httpserver.h" #include "torrentPersistentData.h" #include "TransferListFiltersWidget.h" +#include "propertieswidget.h" using namespace libtorrent; @@ -137,13 +138,16 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis qDebug("create tabWidget"); tabs = new QTabWidget(); vSplitter = new QSplitter(Qt::Horizontal); + hSplitter = new QSplitter(Qt::Vertical, vSplitter); // Transfer List tab + properties = new PropertiesWidget(hSplitter); transferList = new TransferListWidget(vSplitter, BTSession); transferListFilters = new TransferListFiltersWidget(vSplitter, transferList); - + hSplitter->addWidget(transferList); + hSplitter->addWidget(properties); vSplitter->addWidget(transferListFilters); - vSplitter->addWidget(transferList); + vSplitter->addWidget(hSplitter); tabs->addTab(vSplitter, QIcon(QString::fromUtf8(":/Icons/oxygen/folder-remote.png")), tr("Transfers")); vboxLayout->addWidget(tabs); @@ -274,6 +278,8 @@ GUI::~GUI() { delete searchEngine; delete transferListFilters; delete transferList; + delete properties; + delete hSplitter; delete vSplitter; delete checkConnect; qDebug("1"); diff --git a/src/GUI.h b/src/GUI.h index 1cc7dee8d..effe8dfc6 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -58,6 +58,7 @@ class QFrame; class TransferListWidget; class TransferListFiltersWidget; class QSplitter; +class PropertiesWidget; class GUI : public QMainWindow, private Ui::MainWindow{ Q_OBJECT @@ -76,7 +77,9 @@ class GUI : public QMainWindow, private Ui::MainWindow{ QMenu *myTrayIconMenu; TransferListWidget *transferList; TransferListFiltersWidget *transferListFilters; + PropertiesWidget *properties; QSplitter *vSplitter; + QSplitter *hSplitter; QLabel *connecStatusLblIcon; bool systrayIntegration; bool displaySpeedInTitle; diff --git a/src/Icons/oxygen/help-about.png b/src/Icons/oxygen/help-about.png new file mode 100644 index 0000000000000000000000000000000000000000..e1eb7972d484c933cb23c846ca6e77501ca1a97d GIT binary patch literal 734 zcmV<40wMj0P)+f;K8PVh9!*!(H4p;$7};_ilHbUDwTN z?EK+lhc`R_y!UuRN-6x01pX48Suv4qP7`BO!vpET0O+gyXuns$BFJ1;k4`)2(jOVn zLP&)@|>CnmbvB7Sn((ujcbPt6Ul@NW0;qQtu$2F_1Pn zdL+kCE`>_XhusKJI@B)-#kg}{W z9&uoQx@d3IrvW^O3=C;bfeTc%K`7r3&~Sa+c={CK54R{p0ZhOU=EcOIP2%vo zY8yFAz%)4AmW%4$u+JEjmSXz;(N?9I}Yocf`GGok!G?x%fYd3ANf{pVvMA_*YXg{cv7nZBm2@ieWNras&G3D272l_l(i Qb^rhX07*qoM6N<$g0$m2kN^Mx literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/network-server.png b/src/Icons/oxygen/network-server.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a954d44526a447e6f4e693324450868f7443b4 GIT binary patch literal 491 zcmV@I z6tZ>cs#3?$MGAIGp@M&a*2RKp$X#+d-yK9MULgrQczO4}pZ6m4M zO;r>{>SMK1(R3jAkU$c z(ue|C=n(p<8K9a`77{=;?4T$LkSNe1Vn%?5fE)o*{&oS%K|tex5Zy(6z;}}H5(OFOaM9~Q zx7&rU^;%d7NZx5-7`_aL!@KIe_FWhZ2B&COuIuhI#@gB+jYenIeO0r?aeN&F!KL=o zG(F6?Xp54<9?3z011HBvpSaL>eLkDbZu-?)JUISV`@iy0Ug zcY`pa)tkqUfP#`Gt`Q}{`DrEPiAAXl<>lpinR(g8$%zH2dih1^v)|cB0aZ(Qx;Tbt zoKOC7zMvk`wt2Faq_S(id`k2^Pm0i_5b<& zAxc~Md>Q+9-#UNbf82lGf7wh6Z`MDS-!o5x%Vn4DKkGl?&CZkmKjID$>3CoMZ~e!3 zNj}qm-m;E?3T3B%?SE8XsiILP>)QB1(075Iq>6@txGQ7%%rEs*|6lsAx-j5}UAuM{ z6PwsNyNCIU{yPRdu}@bQ=AYJ(YKff=)1Gg>e}#!{-R=6F|78MB{EdIV|9Jh||9AK! zv?L<--()=8``%ugO@#SZ_h)ftZG$R_LWc=P3@@X9THg5(T@DOL22WQ%mvv4FO#rj_ Bsq6p% literal 0 HcmV?d00001 diff --git a/src/Icons/oxygen/urlseed.png b/src/Icons/oxygen/urlseed.png new file mode 100644 index 0000000000000000000000000000000000000000..d0746f6637f91b80648a44684017b096020c2fbf GIT binary patch literal 901 zcmV;01A6?4P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iXT6 z3@0|{X2oLw00RX{L_t(I%bk&3OjCCl#-IN=2iu;OewU95XpxqRb-+N`05_9em<2Rw zLZZg6L=(MW%WkII%wQrhaTiO}Eb&H{UF~9I7u#;OOcIE%+jLu8@JG*wA*XuZ6zE~n@xe%V8iQh>H z*MDJP1Z1B=d+ZrND6vG(~M(T?tIet0R$( z7cdsH;WVRX;c(kYN};HB+aQP;MAHSx3=7V}LoTl2+{Yhao5yv2a|T?wS?~LOB1W6u z^^thG2%g^pmZR9YvkKvO5?~mZtUR1H9$WNfzRdy#lu*hNj0K+pEQ_g_i2KiSSS~SO z%{&;B0XiK6J=HL9c8}xrVnhFTuUc@qhi{o1>;raxH4HTlcy?5xuA&@c;TK4YS*%GJ zoN9Gp^j-wdQ~8prYO+zs%!PkE(+L1vS}cCgCh`MZTA?n!jO_DQpvGxLm$w2Fk>{A0 zibB&$SP}$$eX*NmInMgg;IGYZUMMId50#bt4VqI)WHCi2V+ojaWpMHg-t*YeR%Zh( zFwk-$ot<02+}u-Wxx{*igc(9|Rk>t(BG9d7<0rC|hs{XnQd&h)%8*A>A?UH~p8rmsmYwW}SfwR_s%UL|P bH_l!Hjq5YnqXgLB00000NkvXXu0mjfZJe5J literal 0 HcmV?d00001 diff --git a/src/icons.qrc b/src/icons.qrc index e014c332b..e70126d52 100644 --- a/src/icons.qrc +++ b/src/icons.qrc @@ -91,6 +91,7 @@ Icons/oxygen/gear.png Icons/oxygen/draw-triangle2.png Icons/oxygen/remove.png + Icons/oxygen/peer.png Icons/oxygen/browse.png Icons/oxygen/unsubscribe16.png Icons/oxygen/subscribe.png @@ -104,9 +105,12 @@ Icons/oxygen/list-remove.png Icons/oxygen/connection.png Icons/oxygen/bug.png + Icons/oxygen/help-about.png Icons/oxygen/list-add.png + Icons/oxygen/network-server.png Icons/oxygen/application-x-kgetlist.png Icons/oxygen/folder.png + Icons/oxygen/urlseed.png Icons/oxygen/edit-cut.png Icons/oxygen/unsubscribe.png Icons/oxygen/draw-rectangle.png diff --git a/src/propertiesWidget.ui b/src/propertiesWidget.ui new file mode 100644 index 000000000..759207441 --- /dev/null +++ b/src/propertiesWidget.ui @@ -0,0 +1,487 @@ + + + PropertiesWidget + + + + 0 + 0 + 756 + 300 + + + + Form + + + + + + 0 + + + + + + + + + + 75 + true + + + + Torrent information + + + + + + + + + 50 + false + + + + Save path: + + + + + + + + 50 + false + + + + Creator: + + + + + + + + 50 + false + + + + Torrent hash: + + + + + + + + 50 + false + + + + Comment: + + + + + + + + + + + + + + + + + + + + + 27 + 16777215 + + + + + 50 + false + + + + ... + + + + + + + + + + + + + + + + + + + + + + + + 50 + false + + + + + + + + + + + + + Qt::Horizontal + + + + 185 + 20 + + + + + + + + + + + + 0 + 0 + + + + + 0 + 115 + + + + + Sans Serif + 9 + 75 + false + true + false + false + + + + Current session + + + + 6 + + + 9 + + + + + 6 + + + 0 + + + + + 6 + + + 0 + + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Total uploaded: + + + + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Total downloaded: + + + + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Share ratio: + + + + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Total failed: + + + + + + + + + 6 + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + + 181 + 20 + + + + + + + + + + + + + + + + 0 + 50 + + + + + 75 + true + + + + Downloaded pieces + + + + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Download in correct order (slower but good for previewing) + + + + + + + + + + + + + + General + + + + :/Icons/oxygen/help-about.png:/Icons/oxygen/help-about.png + + + + 16 + 16 + + + + + + + + Trackers + + + + :/Icons/oxygen/network-server.png:/Icons/oxygen/network-server.png + + + + 16 + 16 + + + + + + + + URL seeds + + + + :/Icons/oxygen/urlseed.png:/Icons/oxygen/urlseed.png + + + + 16 + 16 + + + + + + + + Files + + + + :/Icons/oxygen/folder.png:/Icons/oxygen/folder.png + + + + 16 + 16 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp new file mode 100644 index 000000000..4a1b573f3 --- /dev/null +++ b/src/propertieswidget.cpp @@ -0,0 +1,39 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give permission to + * link this program with the OpenSSL project's "OpenSSL" library (or with + * modified versions of it that use the same license as the "OpenSSL" library), + * and distribute the linked executables. You must obey the GNU General Public + * License in all respects for all of the code used other than "OpenSSL". If you + * modify file(s), you may extend this exception to your version of the file(s), + * but you are not obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + * + * Contact : chris@qbittorrent.org + */ + +#include "propertieswidget.h" + +PropertiesWidget::PropertiesWidget(QWidget *parent): QWidget(parent) { + setupUi(this); +} + +PropertiesWidget::~PropertiesWidget() { + +} diff --git a/src/propertieswidget.h b/src/propertieswidget.h new file mode 100644 index 000000000..f439a93d2 --- /dev/null +++ b/src/propertieswidget.h @@ -0,0 +1,44 @@ +/* + * 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 PROPERTIESWIDGET_H +#define PROPERTIESWIDGET_H + +#include +#include "ui_propertiesWidget.h" + +class PropertiesWidget : public QWidget, private Ui::PropertiesWidget { + Q_OBJECT +public: + PropertiesWidget(QWidget *parent); + ~PropertiesWidget(); +}; + +#endif // PROPERTIESWIDGET_H diff --git a/src/src.pro b/src/src.pro index c8b9dbd86..46288d5da 100644 --- a/src/src.pro +++ b/src/src.pro @@ -184,7 +184,8 @@ HEADERS += GUI.h \ supportedEngines.h \ TransferListWidget.h \ TransferListDelegate.h \ - TransferListFiltersWidget.h + TransferListFiltersWidget.h \ + propertieswidget.h FORMS += MainWindow.ui \ options.ui \ about.ui \ @@ -202,7 +203,8 @@ FORMS += MainWindow.ui \ pluginSource.ui \ trackersAdd.ui \ console.ui \ - FeedDownloader.ui + FeedDownloader.ui \ + propertiesWidget.ui SOURCES += GUI.cpp \ main.cpp \ options_imp.cpp \ @@ -225,5 +227,6 @@ SOURCES += GUI.cpp \ SearchTab.cpp \ ico.cpp \ rss.cpp \ - TransferListWidget.cpp + TransferListWidget.cpp \ + propertieswidget.cpp DESTDIR = . From 75e5a7e3d42e018849c4ef73a574b446f7ab5bf9 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 15:41:32 +0000 Subject: [PATCH 19/34] - Made progress on torrent properties (main tab) --- src/GUI.cpp | 4 +- src/TransferListWidget.cpp | 6 + src/TransferListWidget.h | 4 + src/propertiesWidget.ui | 249 +++++++++++++++++++++++-------------- src/propertieswidget.cpp | 78 +++++++++++- src/propertieswidget.h | 22 +++- 6 files changed, 265 insertions(+), 98 deletions(-) diff --git a/src/GUI.cpp b/src/GUI.cpp index bef4e3b84..1689a0ca7 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -141,8 +141,8 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis hSplitter = new QSplitter(Qt::Vertical, vSplitter); // Transfer List tab - properties = new PropertiesWidget(hSplitter); - transferList = new TransferListWidget(vSplitter, BTSession); + transferList = new TransferListWidget(hSplitter, BTSession); + properties = new PropertiesWidget(hSplitter, transferList); transferListFilters = new TransferListFiltersWidget(vSplitter, transferList); hSplitter->addWidget(transferList); hSplitter->addWidget(properties); diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index 2555d197e..b13859b20 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -789,6 +789,12 @@ void TransferListWidget::loadLastSortedColumn() { } } +void TransferListWidget::currentChanged(const QModelIndex& current, const QModelIndex&) { + int row = proxyModel->mapToSource(current).row(); + QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(row)); + emit currentTorrentChanged(h); +} + void TransferListWidget::applyFilter(int f) { switch(f) { case DOWNLOADING: diff --git a/src/TransferListWidget.h b/src/TransferListWidget.h index 474f2bdc4..7e451af3a 100644 --- a/src/TransferListWidget.h +++ b/src/TransferListWidget.h @@ -74,6 +74,7 @@ protected slots: void saveHiddenColumns(); void displayListMenu(const QPoint&); void updateMetadata(QTorrentHandle &h); + void currentChanged(const QModelIndex& current, const QModelIndex&); //void setRowColor(int row, QColor color); public slots: @@ -101,6 +102,9 @@ public slots: void displayDLHoSMenu(const QPoint&); void applyFilter(int f); +signals: + void currentTorrentChanged(QTorrentHandle &h); + }; #endif // TRANSFERLISTWIDGET_H diff --git a/src/propertiesWidget.ui b/src/propertiesWidget.ui index 759207441..ce34fe123 100644 --- a/src/propertiesWidget.ui +++ b/src/propertiesWidget.ui @@ -22,7 +22,7 @@ - + @@ -34,82 +34,146 @@ Torrent information - + - + - - - - 50 - false - - - - Save path: - - - - - - - - 50 - false - - - - Creator: - - - - - - - - 50 - false - - - - Torrent hash: - - - - - - - - 50 - false - - - - Comment: - - + + + + + + 16777215 + 22 + + + + + 50 + false + + + + Save path: + + + + + + + + 50 + false + + + + Creator: + + + + + + + + 50 + false + + + + Torrent hash: + + + + + + + + 50 + false + + + + Comment: + + + + - - - - - + - + + + + + + 16777215 + 22 + + + + + 50 + false + + + + + + + + + + + + 22 + 22 + + + + + 50 + false + + + + ... + + + + + + + + + + 50 + false + + - - - - 27 - 16777215 - + + + + 50 + false + + + + + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + 50 @@ -117,39 +181,12 @@ - ... + - - - - - - - - - - - - - - - - - - - 50 - false - - - - - - - @@ -159,7 +196,7 @@ - 185 + 190 20 @@ -303,6 +340,12 @@ + + + 50 + false + + @@ -310,6 +353,12 @@ + + + 50 + false + + @@ -317,6 +366,12 @@ + + + 50 + false + + @@ -324,6 +379,12 @@ + + + 50 + false + + diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index 4a1b573f3..1f4ac9619 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -28,12 +28,88 @@ * Contact : chris@qbittorrent.org */ +#include +#include #include "propertieswidget.h" +#include "TransferListWidget.h" +#include "torrentPersistentData.h" +#include "realprogressbar.h" +#include "realprogressbarthread.h" -PropertiesWidget::PropertiesWidget(QWidget *parent): QWidget(parent) { +PropertiesWidget::PropertiesWidget(QWidget *parent, TransferListWidget *transferList): QWidget(parent), transferList(transferList) { setupUi(this); + connect(transferList, SIGNAL(currentTorrentChanged(QTorrentHandle&)), this, SLOT(loadTorrentInfos(QTorrentHandle &))); + // Downloaded pieces progress bar + progressBar = new RealProgressBar(this); + progressBar->setForegroundColor(Qt::blue); + progressBarVbox = new QVBoxLayout(RealProgressBox); + progressBarVbox->addWidget(progressBar); + progressBarUpdater = 0; + // Dynamic data refresher + refreshTimer = new QTimer(this); + connect(refreshTimer, SIGNAL(timeout()), this, SLOT(loadDynamicData())); + refreshTimer->start(10000); // 10sec } PropertiesWidget::~PropertiesWidget() { + delete refreshTimer; + if(progressBarUpdater) + delete progressBarUpdater; + delete progressBar; + delete progressBarVbox; +} + +void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { + h = _h; + if(!h.is_valid()) return; + if(progressBarUpdater) + delete progressBarUpdater; + progressBarUpdater = 0; + try { + // Save path + save_path->setText(TorrentPersistentData::getSavePath(h.hash())); + // Author + QString author = h.creator().trimmed(); + if(author.isEmpty()) + author = tr("Unknown"); + creator->setText(author); + // Hash + hash_lbl->setText(h.hash()); + // Comment + comment_lbl->setText(h.comment()); + // downloaded pieces updater + progressBarUpdater = new RealProgressBarThread(progressBar, h); + progressBarUpdater->start(); + } catch(invalid_handle e) { + + } + // Load dynamic data + loadDynamicData(); +} +void PropertiesWidget::loadDynamicData() { + if(!h.is_valid()) return; + try { + // Session infos + failed->setText(misc::friendlyUnit(h.total_failed_bytes())); + upTotal->setText(misc::friendlyUnit(h.total_payload_upload())); + dlTotal->setText(misc::friendlyUnit(h.total_payload_download())); + // Update ratio info + float ratio; + if(h.total_payload_download() == 0){ + if(h.total_payload_upload() == 0) + ratio = 1.; + else + ratio = 10.; // Max ratio + }else{ + ratio = (double)h.total_payload_upload()/(double)h.total_payload_download(); + if(ratio > 10.){ + ratio = 10.; + } + } + shareRatio->setText(QString(QByteArray::number(ratio, 'f', 1))); + // Downloaded pieces + if(progressBarUpdater) + progressBarUpdater->refresh(); + } catch(invalid_handle e) {} } diff --git a/src/propertieswidget.h b/src/propertieswidget.h index f439a93d2..38ed0b2e4 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -33,11 +33,31 @@ #include #include "ui_propertiesWidget.h" +#include "qtorrenthandle.h" + +class TransferListWidget; +class QTimer; +class RealProgressBar; +class QVBoxLayout; +class RealProgressBarThread; class PropertiesWidget : public QWidget, private Ui::PropertiesWidget { Q_OBJECT + +private: + TransferListWidget *transferList; + QTorrentHandle h; + QTimer *refreshTimer; + RealProgressBar *progressBar; + RealProgressBarThread *progressBarUpdater; + QVBoxLayout *progressBarVbox; + +protected slots: + void loadTorrentInfos(QTorrentHandle &h); + void loadDynamicData(); + public: - PropertiesWidget(QWidget *parent); + PropertiesWidget(QWidget *parent, TransferListWidget *transferList); ~PropertiesWidget(); }; From c756412ee63390258a6f5f29d9f0dbccb9229618 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 15:50:00 +0000 Subject: [PATCH 20/34] - Added back "Sequential download" feature --- src/propertieswidget.cpp | 9 +++++++++ src/propertieswidget.h | 1 + 2 files changed, 10 insertions(+) diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index 1f4ac9619..8543b0eb7 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -39,6 +39,7 @@ PropertiesWidget::PropertiesWidget(QWidget *parent, TransferListWidget *transferList): QWidget(parent), transferList(transferList) { setupUi(this); connect(transferList, SIGNAL(currentTorrentChanged(QTorrentHandle&)), this, SLOT(loadTorrentInfos(QTorrentHandle &))); + connect(incrementalDownload, SIGNAL(stateChanged(int)), this, SLOT(setIncrementalDownload(int))); // Downloaded pieces progress bar progressBar = new RealProgressBar(this); progressBar->setForegroundColor(Qt::blue); @@ -77,6 +78,8 @@ void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { hash_lbl->setText(h.hash()); // Comment comment_lbl->setText(h.comment()); + // Sequential download + incrementalDownload->setChecked(TorrentPersistentData::isSequentialDownload(h.hash())); // downloaded pieces updater progressBarUpdater = new RealProgressBarThread(progressBar, h); progressBarUpdater->start(); @@ -113,3 +116,9 @@ void PropertiesWidget::loadDynamicData() { progressBarUpdater->refresh(); } catch(invalid_handle e) {} } + +void PropertiesWidget::setIncrementalDownload(int checkboxState) { + if(!h.is_valid()) return; + h.set_sequential_download(checkboxState == Qt::Checked); + TorrentPersistentData::saveSequentialStatus(h); +} diff --git a/src/propertieswidget.h b/src/propertieswidget.h index 38ed0b2e4..f4d8130e9 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -55,6 +55,7 @@ private: protected slots: void loadTorrentInfos(QTorrentHandle &h); void loadDynamicData(); + void setIncrementalDownload(int checkboxState); public: PropertiesWidget(QWidget *parent, TransferListWidget *transferList); From cee9ece4c775a182a0aeeec7eb517fe370b1cc28 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 16:19:21 +0000 Subject: [PATCH 21/34] - Added back trackers display in torrent properties --- src/GUI.cpp | 2 +- src/propertiesWidget.ui | 280 ++++++++++++++++++++++++++++++++++++++- src/propertieswidget.cpp | 51 ++++++- src/propertieswidget.h | 9 +- 4 files changed, 338 insertions(+), 4 deletions(-) diff --git a/src/GUI.cpp b/src/GUI.cpp index 1689a0ca7..1472f5a1f 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -142,7 +142,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis // Transfer List tab transferList = new TransferListWidget(hSplitter, BTSession); - properties = new PropertiesWidget(hSplitter, transferList); + properties = new PropertiesWidget(hSplitter, transferList, BTSession); transferListFilters = new TransferListFiltersWidget(vSplitter, transferList); hSplitter->addWidget(transferList); hSplitter->addWidget(properties); diff --git a/src/propertiesWidget.ui b/src/propertiesWidget.ui index ce34fe123..8725943de 100644 --- a/src/propertiesWidget.ui +++ b/src/propertiesWidget.ui @@ -451,7 +451,285 @@ - + + + + + + 6 + + + 0 + + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Trackers: + + + + + + + 6 + + + 0 + + + + + + 0 + 0 + + + + QAbstractItemView::ExtendedSelection + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + + :/Icons/oxygen/list-remove.png:/Icons/oxygen/list-remove.png + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + + :/Icons/oxygen/list-add.png:/Icons/oxygen/list-add.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 6 + + + 0 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + + :/Icons/uparrow.png:/Icons/uparrow.png + + + + + + + + 24 + 24 + + + + + 24 + 24 + + + + + + + + :/Icons/downarrow.png:/Icons/downarrow.png + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + 6 + + + 0 + + + + + + 16777215 + 16 + + + + + Sans Serif + 9 + 50 + false + false + false + false + + + + Current tracker: + + + + + + + + 16777215 + 16 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index 8543b0eb7..de26eae6c 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -29,14 +29,17 @@ */ #include +#include #include +#include #include "propertieswidget.h" #include "TransferListWidget.h" #include "torrentPersistentData.h" #include "realprogressbar.h" #include "realprogressbarthread.h" +#include "bittorrent.h" -PropertiesWidget::PropertiesWidget(QWidget *parent, TransferListWidget *transferList): QWidget(parent), transferList(transferList) { +PropertiesWidget::PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession): QWidget(parent), transferList(transferList), BTSession(BTSession) { setupUi(this); connect(transferList, SIGNAL(currentTorrentChanged(QTorrentHandle&)), this, SLOT(loadTorrentInfos(QTorrentHandle &))); connect(incrementalDownload, SIGNAL(stateChanged(int)), this, SLOT(setIncrementalDownload(int))); @@ -80,6 +83,8 @@ void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { comment_lbl->setText(h.comment()); // Sequential download incrementalDownload->setChecked(TorrentPersistentData::isSequentialDownload(h.hash())); + // Trackers + loadTrackers(); // downloaded pieces updater progressBarUpdater = new RealProgressBarThread(progressBar, h); progressBarUpdater->start(); @@ -122,3 +127,47 @@ void PropertiesWidget::setIncrementalDownload(int checkboxState) { h.set_sequential_download(checkboxState == Qt::Checked); TorrentPersistentData::saveSequentialStatus(h); } + +void PropertiesWidget::loadTrackers() { + if(!h.is_valid()) return; + //Trackers + std::vector trackers = h.trackers(); + trackersURLS->clear(); + QHash errors = BTSession->getTrackersErrors(h.hash()); + unsigned int nbTrackers = trackers.size(); + for(unsigned int i=0; isetForeground(QBrush(QColor("red"))); + // Set tooltip + QString msg=""; + unsigned int i=0; + foreach(QString word, errors[current_tracker].split(" ")) { + if(i > 0 && i%5!=1) msg += " "; + msg += word; + if(i> 0 && i%5==0) msg += "\n"; + ++i; + } + item->setToolTip(msg); + } else { + item->setForeground(QBrush(QColor("green"))); + } + } + QString tracker = h.current_tracker().trimmed(); + if(!tracker.isEmpty()){ + trackerURL->setText(tracker); + }else{ + trackerURL->setText(tr("None - Unreachable?")); + } +} + +/* Tab buttons */ +void PropertiesWidget::on_main_infos_button_clicked() { + stackedProperties->setCurrentIndex(MAIN_TAB); +} + +void PropertiesWidget::on_trackers_button_clicked() { + stackedProperties->setCurrentIndex(TRACKERS_TAB); +} diff --git a/src/propertieswidget.h b/src/propertieswidget.h index f4d8130e9..cb381cfc4 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -40,6 +40,9 @@ class QTimer; class RealProgressBar; class QVBoxLayout; class RealProgressBarThread; +class bittorrent; + +enum Tab {MAIN_TAB, TRACKERS_TAB, URLSEEDS_TAB, FILES_TAB}; class PropertiesWidget : public QWidget, private Ui::PropertiesWidget { Q_OBJECT @@ -51,14 +54,18 @@ private: RealProgressBar *progressBar; RealProgressBarThread *progressBarUpdater; QVBoxLayout *progressBarVbox; + bittorrent* BTSession; protected slots: void loadTorrentInfos(QTorrentHandle &h); void loadDynamicData(); void setIncrementalDownload(int checkboxState); + void loadTrackers(); + void on_main_infos_button_clicked(); + void on_trackers_button_clicked(); public: - PropertiesWidget(QWidget *parent, TransferListWidget *transferList); + PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession); ~PropertiesWidget(); }; From 8686ef0892a1e87b489709881cd88f4bdbd2e90c Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 16:39:17 +0000 Subject: [PATCH 22/34] - A little eye candy --- src/propertiesWidget.ui | 35 +++++++++++++++++++++++++++++++++++ src/propertieswidget.cpp | 22 +++++++++++++++++++--- src/propertieswidget.h | 3 +++ 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/src/propertiesWidget.ui b/src/propertiesWidget.ui index 8725943de..60c422148 100644 --- a/src/propertiesWidget.ui +++ b/src/propertiesWidget.ui @@ -732,10 +732,24 @@ + + + + Qt::Horizontal + + + + + QPushButton { +border: 1px solid rgb(85, 81, 91); +border-radius: 3px; +padding: 2px; +} + General @@ -753,6 +767,13 @@ + + QPushButton { +border: 1px solid rgb(85, 81, 91); +border-radius: 3px; +padding: 2px; +} + Trackers @@ -770,6 +791,13 @@ + + QPushButton { +border: 1px solid rgb(85, 81, 91); +border-radius: 3px; +padding: 2px; +} + URL seeds @@ -787,6 +815,13 @@ + + QPushButton { +border: 1px solid rgb(85, 81, 91); +border-radius: 3px; +padding: 2px; +} + Files diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index de26eae6c..5c9e82c06 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -39,6 +39,9 @@ #include "realprogressbarthread.h" #include "bittorrent.h" +#define DEFAULT_BUTTON_CSS "QPushButton {border: 1px solid rgb(85, 81, 91);border-radius: 3px;padding: 2px;}" +#define SELECTED_BUTTON_CSS "QPushButton {border: 1px solid rgb(85, 81, 91);border-radius: 3px;padding: 2px;background-color: rgb(255, 208, 105);}" + PropertiesWidget::PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession): QWidget(parent), transferList(transferList), BTSession(BTSession) { setupUi(this); connect(transferList, SIGNAL(currentTorrentChanged(QTorrentHandle&)), this, SLOT(loadTorrentInfos(QTorrentHandle &))); @@ -68,7 +71,7 @@ void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { if(!h.is_valid()) return; if(progressBarUpdater) delete progressBarUpdater; - progressBarUpdater = 0; + progressBarUpdater = 0; try { // Save path save_path->setText(TorrentPersistentData::getSavePath(h.hash())); @@ -124,8 +127,8 @@ void PropertiesWidget::loadDynamicData() { void PropertiesWidget::setIncrementalDownload(int checkboxState) { if(!h.is_valid()) return; - h.set_sequential_download(checkboxState == Qt::Checked); - TorrentPersistentData::saveSequentialStatus(h); + h.set_sequential_download(checkboxState == Qt::Checked); + TorrentPersistentData::saveSequentialStatus(h); } void PropertiesWidget::loadTrackers() { @@ -164,10 +167,23 @@ void PropertiesWidget::loadTrackers() { } /* Tab buttons */ +QPushButton* PropertiesWidget::getButtonFromIndex(int index) { + switch(index) { + case TRACKERS_TAB: + return trackers_button; + default: + return main_infos_button; + } +} + void PropertiesWidget::on_main_infos_button_clicked() { + getButtonFromIndex(stackedProperties->currentIndex())->setStyleSheet(DEFAULT_BUTTON_CSS); stackedProperties->setCurrentIndex(MAIN_TAB); + main_infos_button->setStyleSheet(SELECTED_BUTTON_CSS); } void PropertiesWidget::on_trackers_button_clicked() { + getButtonFromIndex(stackedProperties->currentIndex())->setStyleSheet(DEFAULT_BUTTON_CSS); stackedProperties->setCurrentIndex(TRACKERS_TAB); + trackers_button->setStyleSheet(SELECTED_BUTTON_CSS); } diff --git a/src/propertieswidget.h b/src/propertieswidget.h index cb381cfc4..059ae9255 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -56,6 +56,9 @@ private: QVBoxLayout *progressBarVbox; bittorrent* BTSession; +protected: + QPushButton* getButtonFromIndex(int index); + protected slots: void loadTorrentInfos(QTorrentHandle &h); void loadDynamicData(); From 4a33917e8973a7437ea0729aa04b2444e944301e Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 16:48:38 +0000 Subject: [PATCH 23/34] - All buttons work now --- src/propertiesWidget.ui | 2 ++ src/propertieswidget.cpp | 18 +++++++++++++++++- src/propertieswidget.h | 2 ++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/propertiesWidget.ui b/src/propertiesWidget.ui index 60c422148..79fa11913 100644 --- a/src/propertiesWidget.ui +++ b/src/propertiesWidget.ui @@ -730,6 +730,8 @@ + + diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index 5c9e82c06..a153378bb 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -169,8 +169,12 @@ void PropertiesWidget::loadTrackers() { /* Tab buttons */ QPushButton* PropertiesWidget::getButtonFromIndex(int index) { switch(index) { - case TRACKERS_TAB: + case TRACKERS_TAB: return trackers_button; + case URLSEEDS_TAB: + return url_seeds_button; + case FILES_TAB: + return files_button; default: return main_infos_button; } @@ -187,3 +191,15 @@ void PropertiesWidget::on_trackers_button_clicked() { stackedProperties->setCurrentIndex(TRACKERS_TAB); trackers_button->setStyleSheet(SELECTED_BUTTON_CSS); } + +void PropertiesWidget::on_url_seeds_button_clicked() { + getButtonFromIndex(stackedProperties->currentIndex())->setStyleSheet(DEFAULT_BUTTON_CSS); + stackedProperties->setCurrentIndex(URLSEEDS_TAB); + url_seeds_button->setStyleSheet(SELECTED_BUTTON_CSS); +} + +void PropertiesWidget::on_files_button_clicked() { + getButtonFromIndex(stackedProperties->currentIndex())->setStyleSheet(DEFAULT_BUTTON_CSS); + stackedProperties->setCurrentIndex(FILES_TAB); + files_button->setStyleSheet(SELECTED_BUTTON_CSS); +} diff --git a/src/propertieswidget.h b/src/propertieswidget.h index 059ae9255..efd7d60a0 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -66,6 +66,8 @@ protected slots: void loadTrackers(); void on_main_infos_button_clicked(); void on_trackers_button_clicked(); + void on_url_seeds_button_clicked(); + void on_files_button_clicked(); public: PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession); From a7da280f57663b5f5a2ca236dc693374dc6b170b Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 19:09:10 +0000 Subject: [PATCH 24/34] - Usability improvement in torrent properties --- src/GUI.cpp | 12 +++++--- src/GUI.h | 4 ++- src/propertiesWidget.ui | 43 ++++++++++++++------------- src/propertieswidget.cpp | 63 ++++++++++++++++++++++++++++++++-------- src/propertieswidget.h | 6 ++++ 5 files changed, 91 insertions(+), 37 deletions(-) diff --git a/src/GUI.cpp b/src/GUI.cpp index 1472f5a1f..c48deb4f3 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -138,16 +139,18 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis qDebug("create tabWidget"); tabs = new QTabWidget(); vSplitter = new QSplitter(Qt::Horizontal); - hSplitter = new QSplitter(Qt::Vertical, vSplitter); + rightPanel = new QWidget(vSplitter); + hSplitter = new QVBoxLayout(vSplitter); + rightPanel->setLayout(hSplitter); // Transfer List tab - transferList = new TransferListWidget(hSplitter, BTSession); - properties = new PropertiesWidget(hSplitter, transferList, BTSession); + transferList = new TransferListWidget(rightPanel, BTSession); + properties = new PropertiesWidget(rightPanel, transferList, BTSession); transferListFilters = new TransferListFiltersWidget(vSplitter, transferList); hSplitter->addWidget(transferList); hSplitter->addWidget(properties); vSplitter->addWidget(transferListFilters); - vSplitter->addWidget(hSplitter); + vSplitter->addWidget(rightPanel); tabs->addTab(vSplitter, QIcon(QString::fromUtf8(":/Icons/oxygen/folder-remote.png")), tr("Transfers")); vboxLayout->addWidget(tabs); @@ -280,6 +283,7 @@ GUI::~GUI() { delete transferList; delete properties; delete hSplitter; + delete rightPanel; delete vSplitter; delete checkConnect; qDebug("1"); diff --git a/src/GUI.h b/src/GUI.h index effe8dfc6..6785fbf04 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -59,6 +59,7 @@ class TransferListWidget; class TransferListFiltersWidget; class QSplitter; class PropertiesWidget; +class QVBoxLayout; class GUI : public QMainWindow, private Ui::MainWindow{ Q_OBJECT @@ -78,8 +79,9 @@ class GUI : public QMainWindow, private Ui::MainWindow{ TransferListWidget *transferList; TransferListFiltersWidget *transferListFilters; PropertiesWidget *properties; + QVBoxLayout *hSplitter; + QWidget *rightPanel; QSplitter *vSplitter; - QSplitter *hSplitter; QLabel *connecStatusLblIcon; bool systrayIntegration; bool displaySpeedInTitle; diff --git a/src/propertiesWidget.ui b/src/propertiesWidget.ui index 79fa11913..8391d966f 100644 --- a/src/propertiesWidget.ui +++ b/src/propertiesWidget.ui @@ -7,9 +7,21 @@ 0 0 756 - 300 + 291 + + + 0 + 0 + + + + + 16777215 + 333 + + Form @@ -27,6 +39,7 @@ + 8 75 true @@ -49,6 +62,7 @@ + 8 50 false @@ -62,6 +76,7 @@ + 8 50 false @@ -75,6 +90,7 @@ + 8 50 false @@ -88,6 +104,7 @@ + 8 50 false @@ -221,8 +238,7 @@ - Sans Serif - 9 + 8 75 false true @@ -260,8 +276,6 @@ - Sans Serif - 9 50 false false @@ -278,8 +292,6 @@ - Sans Serif - 9 50 false false @@ -296,13 +308,8 @@ - Sans Serif - 9 50 - false false - false - false @@ -314,8 +321,6 @@ - Sans Serif - 9 50 false false @@ -422,6 +427,7 @@ + 8 75 true @@ -435,8 +441,7 @@ - Sans Serif - 9 + 8 50 false false @@ -465,8 +470,7 @@ - Sans Serif - 9 + 8 50 false false @@ -686,8 +690,7 @@ - Sans Serif - 9 + 8 50 false false diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index a153378bb..31b43e39f 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include "propertieswidget.h" #include "TransferListWidget.h" #include "torrentPersistentData.h" @@ -44,8 +45,12 @@ PropertiesWidget::PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession): QWidget(parent), transferList(transferList), BTSession(BTSession) { setupUi(this); + state = VISIBLE; + reduce(); + connect(transferList, SIGNAL(currentTorrentChanged(QTorrentHandle&)), this, SLOT(loadTorrentInfos(QTorrentHandle &))); connect(incrementalDownload, SIGNAL(stateChanged(int)), this, SLOT(setIncrementalDownload(int))); + // Downloaded pieces progress bar progressBar = new RealProgressBar(this); progressBar->setForegroundColor(Qt::blue); @@ -66,6 +71,20 @@ PropertiesWidget::~PropertiesWidget() { delete progressBarVbox; } +void PropertiesWidget::reduce() { + if(state == VISIBLE) { + stackedProperties->setFixedHeight(0); + state = REDUCED; + } +} + +void PropertiesWidget::slide() { + if(state == REDUCED) { + stackedProperties->setFixedHeight(232); + state = VISIBLE; + } +} + void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { h = _h; if(!h.is_valid()) return; @@ -181,25 +200,45 @@ QPushButton* PropertiesWidget::getButtonFromIndex(int index) { } void PropertiesWidget::on_main_infos_button_clicked() { - getButtonFromIndex(stackedProperties->currentIndex())->setStyleSheet(DEFAULT_BUTTON_CSS); - stackedProperties->setCurrentIndex(MAIN_TAB); - main_infos_button->setStyleSheet(SELECTED_BUTTON_CSS); + if(state == VISIBLE && stackedProperties->currentIndex() == MAIN_TAB) { + reduce(); + } else { + slide(); + getButtonFromIndex(stackedProperties->currentIndex())->setStyleSheet(DEFAULT_BUTTON_CSS); + stackedProperties->setCurrentIndex(MAIN_TAB); + main_infos_button->setStyleSheet(SELECTED_BUTTON_CSS); + } } void PropertiesWidget::on_trackers_button_clicked() { - getButtonFromIndex(stackedProperties->currentIndex())->setStyleSheet(DEFAULT_BUTTON_CSS); - stackedProperties->setCurrentIndex(TRACKERS_TAB); - trackers_button->setStyleSheet(SELECTED_BUTTON_CSS); + if(state == VISIBLE && stackedProperties->currentIndex() == TRACKERS_TAB) { + reduce(); + } else { + slide(); + getButtonFromIndex(stackedProperties->currentIndex())->setStyleSheet(DEFAULT_BUTTON_CSS); + stackedProperties->setCurrentIndex(TRACKERS_TAB); + trackers_button->setStyleSheet(SELECTED_BUTTON_CSS); + } } void PropertiesWidget::on_url_seeds_button_clicked() { - getButtonFromIndex(stackedProperties->currentIndex())->setStyleSheet(DEFAULT_BUTTON_CSS); - stackedProperties->setCurrentIndex(URLSEEDS_TAB); - url_seeds_button->setStyleSheet(SELECTED_BUTTON_CSS); + if(state == VISIBLE && stackedProperties->currentIndex() == URLSEEDS_TAB) { + reduce(); + } else { + slide(); + getButtonFromIndex(stackedProperties->currentIndex())->setStyleSheet(DEFAULT_BUTTON_CSS); + stackedProperties->setCurrentIndex(URLSEEDS_TAB); + url_seeds_button->setStyleSheet(SELECTED_BUTTON_CSS); + } } void PropertiesWidget::on_files_button_clicked() { - getButtonFromIndex(stackedProperties->currentIndex())->setStyleSheet(DEFAULT_BUTTON_CSS); - stackedProperties->setCurrentIndex(FILES_TAB); - files_button->setStyleSheet(SELECTED_BUTTON_CSS); + if(state == VISIBLE && stackedProperties->currentIndex() == FILES_TAB) { + reduce(); + } else { + slide(); + getButtonFromIndex(stackedProperties->currentIndex())->setStyleSheet(DEFAULT_BUTTON_CSS); + stackedProperties->setCurrentIndex(FILES_TAB); + files_button->setStyleSheet(SELECTED_BUTTON_CSS); + } } diff --git a/src/propertieswidget.h b/src/propertieswidget.h index efd7d60a0..1fdd8006d 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -43,6 +43,7 @@ class RealProgressBarThread; class bittorrent; enum Tab {MAIN_TAB, TRACKERS_TAB, URLSEEDS_TAB, FILES_TAB}; +enum SlideState {REDUCED, VISIBLE}; class PropertiesWidget : public QWidget, private Ui::PropertiesWidget { Q_OBJECT @@ -55,6 +56,7 @@ private: RealProgressBarThread *progressBarUpdater; QVBoxLayout *progressBarVbox; bittorrent* BTSession; + SlideState state; protected: QPushButton* getButtonFromIndex(int index); @@ -69,6 +71,10 @@ protected slots: void on_url_seeds_button_clicked(); void on_files_button_clicked(); +public slots: + void reduce(); + void slide(); + public: PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession); ~PropertiesWidget(); From 92a9d0456897ce109a253f2bc77fbe958773d144 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 19:54:22 +0000 Subject: [PATCH 25/34] - Fix torrent deletion - Fix extended selection in transfer list - Disable and clear torrent properties when necessary - Set correct visual attributes to transfer list --- src/TransferListWidget.cpp | 30 ++++++++++++++++++++++-------- src/propertieswidget.cpp | 32 ++++++++++++++++++++++++++++++-- src/propertieswidget.h | 1 + 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index b13859b20..821ade418 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -79,6 +79,10 @@ TransferListWidget::TransferListWidget(QWidget *parent, bittorrent *_BTSession): setRootIsDecorated(false); setAllColumnsShowFocus(true); setSortingEnabled(true); + setSelectionMode(QAbstractItemView::ExtendedSelection); + setItemsExpandable(false); + setAutoScroll(true); + hideColumn(PRIORITY); hideColumn(HASH); hideColumn(STATUS); @@ -139,6 +143,9 @@ void TransferListWidget::addTorrent(QTorrentHandle& h) { listModel->setData(listModel->index(row, STATUS), DOWNLOADING); //setRowColor(row, QString::fromUtf8("grey")); } + // Select first torrent to be added + if(listModel->rowCount() == 1) + selectionModel()->setCurrentIndex(proxyModel->index(row, NAME), QItemSelectionModel::SelectCurrent|QItemSelectionModel::Rows); } catch(invalid_handle e) { // Remove added torrent listModel->removeRow(row); @@ -403,11 +410,13 @@ void TransferListWidget::deleteSelectedTorrents() { tr("&Yes"), tr("&No"), QString(), 0, 1); if(ret) return; + QStringList hashes; foreach(const QModelIndex &index, selectedIndexes) { // Get the file hash - int row = proxyModel->mapToSource(index).row(); - QString hash = getHashFromRow(row); - deleteTorrent(row); + hashes << getHashFromRow(proxyModel->mapToSource(index).row()); + } + foreach(const QString &hash, hashes) { + deleteTorrent(getRowFromHash(hash)); BTSession->deleteTorrent(hash, false); } } @@ -423,11 +432,13 @@ void TransferListWidget::deletePermSelectedTorrents() { tr("&Yes"), tr("&No"), QString(), 0, 1); if(ret) return; + QStringList hashes; foreach(const QModelIndex &index, selectedIndexes) { // Get the file hash - int row = proxyModel->mapToSource(index).row(); - QString hash = getHashFromRow(row); - deleteTorrent(row); + hashes << getHashFromRow(proxyModel->mapToSource(index).row()); + } + foreach(const QString &hash, hashes) { + deleteTorrent(getRowFromHash(hash)); BTSession->deleteTorrent(hash, true); } } @@ -790,8 +801,11 @@ void TransferListWidget::loadLastSortedColumn() { } void TransferListWidget::currentChanged(const QModelIndex& current, const QModelIndex&) { - int row = proxyModel->mapToSource(current).row(); - QTorrentHandle h = BTSession->getTorrentHandle(getHashFromRow(row)); + QTorrentHandle h; + if(current.isValid()) { + int row = proxyModel->mapToSource(current).row(); + h = BTSession->getTorrentHandle(getHashFromRow(row)); + } emit currentTorrentChanged(h); } diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index 31b43e39f..63d160e70 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -46,7 +46,13 @@ PropertiesWidget::PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession): QWidget(parent), transferList(transferList), BTSession(BTSession) { setupUi(this); state = VISIBLE; - reduce(); + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + if(!settings.value("TorrentProperties/Visible", false).toBool()) { + reduce(); + } else { + main_infos_button->setStyleSheet(SELECTED_BUTTON_CSS); + setEnabled(false); + } connect(transferList, SIGNAL(currentTorrentChanged(QTorrentHandle&)), this, SLOT(loadTorrentInfos(QTorrentHandle &))); connect(incrementalDownload, SIGNAL(stateChanged(int)), this, SLOT(setIncrementalDownload(int))); @@ -64,6 +70,8 @@ PropertiesWidget::PropertiesWidget(QWidget *parent, TransferListWidget *transfer } PropertiesWidget::~PropertiesWidget() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.setValue("TorrentProperties/Visible", state==VISIBLE); delete refreshTimer; if(progressBarUpdater) delete progressBarUpdater; @@ -85,9 +93,29 @@ void PropertiesWidget::slide() { } } +void PropertiesWidget::clear() { + save_path->clear(); + creator->clear(); + hash_lbl->clear(); + comment_lbl->clear(); + incrementalDownload->setChecked(false); + trackersURLS->clear(); + trackerURL->clear(); + progressBar->setProgress(QRealArray()); + failed->clear(); + upTotal->clear(); + dlTotal->clear(); + shareRatio->clear(); + setEnabled(false); +} + void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { h = _h; - if(!h.is_valid()) return; + if(!h.is_valid()) { + clear(); + return; + } + setEnabled(true); if(progressBarUpdater) delete progressBarUpdater; progressBarUpdater = 0; diff --git a/src/propertieswidget.h b/src/propertieswidget.h index 1fdd8006d..ba12d5f9f 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -74,6 +74,7 @@ protected slots: public slots: void reduce(); void slide(); + void clear(); public: PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession); From 6a028c9efdb9c79e6286eab0ef2f450e624d825a Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 8 Nov 2009 20:23:02 +0000 Subject: [PATCH 26/34] - Display URL seeds in torrent properties --- src/propertiesWidget.ui | 159 ++++++++++++++++++++++++++++++++++----- src/propertieswidget.cpp | 23 ++++++ src/propertieswidget.h | 1 + 3 files changed, 163 insertions(+), 20 deletions(-) diff --git a/src/propertiesWidget.ui b/src/propertiesWidget.ui index 8391d966f..1aaffde69 100644 --- a/src/propertiesWidget.ui +++ b/src/propertiesWidget.ui @@ -7,7 +7,7 @@ 0 0 756 - 291 + 333 @@ -466,23 +466,6 @@ 0 - - - - - 8 - 50 - false - false - false - false - - - - Trackers: - - - @@ -733,8 +716,144 @@ - - + + + + + + + + + 6 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 24 + 24 + + + + + + + + :/Icons/oxygen/list-remove.png:/Icons/oxygen/list-remove.png + + + + + + + + 24 + 24 + + + + + + + + :/Icons/oxygen/list-add.png:/Icons/oxygen/list-add.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + Qt::CustomContextMenu + + + QAbstractItemView::AllEditTriggers + + + QAbstractItemView::ExtendedSelection + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Collapse all + + + + + + + Expand all + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index 63d160e70..a784650b3 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -135,6 +135,8 @@ void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { incrementalDownload->setChecked(TorrentPersistentData::isSequentialDownload(h.hash())); // Trackers loadTrackers(); + // URL seeds + loadUrlSeeds(); // downloaded pieces updater progressBarUpdater = new RealProgressBarThread(progressBar, h); progressBarUpdater->start(); @@ -213,6 +215,27 @@ void PropertiesWidget::loadTrackers() { } } +void PropertiesWidget::loadUrlSeeds(){ + QStringList already_added; + listWebSeeds->clear(); + QVariantList url_seeds = TorrentPersistentData::getUrlSeeds(h.hash()); + foreach(const QVariant &var_url_seed, url_seeds){ + QString url_seed = var_url_seed.toString(); + if(!url_seed.isEmpty()) { + new QListWidgetItem(url_seed, listWebSeeds); + already_added << url_seed; + } + } + // Load the hard-coded url seeds + QStringList hc_seeds = h.url_seeds(); + // Add hard coded url seeds + foreach(const QString &hc_seed, hc_seeds){ + if(!already_added.contains(hc_seed)){ + new QListWidgetItem(hc_seed, listWebSeeds); + } + } +} + /* Tab buttons */ QPushButton* PropertiesWidget::getButtonFromIndex(int index) { switch(index) { diff --git a/src/propertieswidget.h b/src/propertieswidget.h index ba12d5f9f..d0a3ae1d7 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -66,6 +66,7 @@ protected slots: void loadDynamicData(); void setIncrementalDownload(int checkboxState); void loadTrackers(); + void loadUrlSeeds(); void on_main_infos_button_clicked(); void on_trackers_button_clicked(); void on_url_seeds_button_clicked(); From bf727c11d397ce6d47fb667dc95db3a1a239e129 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 9 Nov 2009 06:59:18 +0000 Subject: [PATCH 27/34] - Fix seeds/leech and ETA display of torrents started in pause --- src/TransferListWidget.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index 821ade418..c34585e09 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -130,6 +130,8 @@ void TransferListWidget::addTorrent(QTorrentHandle& h) { listModel->insertRow(row); listModel->setData(listModel->index(row, NAME), QVariant(h.name())); listModel->setData(listModel->index(row, SIZE), QVariant((qlonglong)h.actual_size())); + listModel->setData(listModel->index(row, ETA), QVariant((qlonglong)-1)); + listModel->setData(listModel->index(row, SEEDSLEECH), QVariant(QString::fromUtf8("0/0"))); if(BTSession->isQueueingEnabled() && !h.is_seed()) listModel->setData(listModel->index(row, PRIORITY), QVariant((int)BTSession->getDlTorrentPriority(h.hash()))); listModel->setData(listModel->index(row, HASH), QVariant(h.hash())); From 6ecde51e4577160b1e5593fbf6e8230663b4600d Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 9 Nov 2009 07:05:06 +0000 Subject: [PATCH 28/34] - Make sure a torrent is always selected when we switch filters --- src/TransferListWidget.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index c34585e09..2dfc949de 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -828,4 +828,7 @@ void TransferListWidget::applyFilter(int f) { default: proxyModel->setFilterRegExp(QRegExp()); } + // Select first item if nothing is selected + if(selectionModel()->selectedRows(0).empty() && proxyModel->rowCount() > 0) + selectionModel()->setCurrentIndex(proxyModel->index(0, NAME), QItemSelectionModel::SelectCurrent|QItemSelectionModel::Rows); } From 9bc90fc7b28f3b59b25cf10ae54bb1e1a33770a4 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 9 Nov 2009 08:56:21 +0000 Subject: [PATCH 29/34] - Huge forward porting of all previous properties features to the new properties panel (probably very buggy but most of the code should be there and it compiles) --- src/PropListDelegate.h | 36 +- src/TransferListWidget.cpp | 8 + src/TransferListWidget.h | 1 + src/arborescence.h | 27 +- src/properties.ui | 1080 ------------------------------------ src/properties_imp.cpp | 739 ------------------------ src/properties_imp.h | 109 ---- src/propertieswidget.cpp | 495 ++++++++++++++++- src/propertieswidget.h | 35 ++ src/seeding.ui | 159 ------ src/src.pro | 4 - src/torrentAddition.h | 4 +- 12 files changed, 572 insertions(+), 2125 deletions(-) delete mode 100644 src/properties.ui delete mode 100644 src/properties_imp.cpp delete mode 100644 src/properties_imp.h delete mode 100644 src/seeding.ui diff --git a/src/PropListDelegate.h b/src/PropListDelegate.h index 6bd694c5d..d77bbb5fe 100644 --- a/src/PropListDelegate.h +++ b/src/PropListDelegate.h @@ -43,26 +43,17 @@ #include "misc.h" // Defines for properties list columns -#define NAME 0 -#define SIZE 1 -#define PROGRESS 2 -#define PRIORITY 3 -#define INDEX 4 - -#define IGNORED 0 -#define NORMAL 1 -#define HIGH 2 -#define MAXIMUM 7 +enum PropColumn {NAME, SIZE, PROGRESS, PRIORITY, INDEX}; +enum PropPriority {IGNORED=0, NORMAL=1, HIGH=2, MAXIMUM=7}; class PropListDelegate: public QItemDelegate { Q_OBJECT - private: - bool* filteredFilesChanged; + signals: + void filteredFilesChanged(); public: - PropListDelegate(QObject *parent=0, bool* filteredFilesChanged=0) : QItemDelegate(parent){ - this->filteredFilesChanged = filteredFilesChanged; + PropListDelegate(QObject *parent=0) : QItemDelegate(parent){ } ~PropListDelegate(){} @@ -165,7 +156,7 @@ class PropListDelegate: public QItemDelegate { } public slots: - void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) { QComboBox *combobox = static_cast(editor); int value = combobox->currentIndex(); qDebug("Setting combobox value in index: %d", value); @@ -174,8 +165,7 @@ class PropListDelegate: public QItemDelegate { case 0: if(old_val != IGNORED){ model->setData(index, QVariant(IGNORED)); - if(filteredFilesChanged != 0) - *filteredFilesChanged = true; + emit filteredFilesChanged(); } else { // XXX: hack to force the model to send the itemChanged() signal model->setData(index, QVariant(NORMAL)); @@ -190,15 +180,13 @@ class PropListDelegate: public QItemDelegate { // } else { model->setData(index, QVariant(HIGH)); model->setData(index, QVariant(NORMAL)); - if(filteredFilesChanged != 0) - *filteredFilesChanged = true; + emit filteredFilesChanged(); // } break; case 2: if(old_val != HIGH){ model->setData(index, QVariant(HIGH)); - if(filteredFilesChanged != 0) - *filteredFilesChanged = true; + emit filteredFilesChanged(); } else { model->setData(index, QVariant(NORMAL)); model->setData(index, QVariant(HIGH)); @@ -207,8 +195,7 @@ class PropListDelegate: public QItemDelegate { case 3: if(old_val != MAXIMUM){ model->setData(index, QVariant(MAXIMUM)); - if(filteredFilesChanged != 0) - *filteredFilesChanged = true; + emit filteredFilesChanged(); } else { model->setData(index, QVariant(HIGH)); model->setData(index, QVariant(MAXIMUM)); @@ -217,8 +204,7 @@ class PropListDelegate: public QItemDelegate { default: if(old_val != NORMAL){ model->setData(index, QVariant(NORMAL)); - if(filteredFilesChanged != 0) - *filteredFilesChanged = true; + emit filteredFilesChanged(); } else { model->setData(index, QVariant(HIGH)); model->setData(index, QVariant(NORMAL)); diff --git a/src/TransferListWidget.cpp b/src/TransferListWidget.cpp index 2dfc949de..e5d9d84d1 100644 --- a/src/TransferListWidget.cpp +++ b/src/TransferListWidget.cpp @@ -832,3 +832,11 @@ void TransferListWidget::applyFilter(int f) { if(selectionModel()->selectedRows(0).empty() && proxyModel->rowCount() > 0) selectionModel()->setCurrentIndex(proxyModel->index(0, NAME), QItemSelectionModel::SelectCurrent|QItemSelectionModel::Rows); } + +void TransferListWidget::updateTorrentSizeAndProgress(QString hash) { + int row = getRowFromHash(hash); + Q_ASSERT(row != -1); + QTorrentHandle h = BTSession->getTorrentHandle(hash); + listModel->setData(listModel->index(row, SIZE), QVariant((qlonglong)h.actual_size())); + listModel->setData(listModel->index(row, PROGRESS), QVariant((double)h.progress())); +} diff --git a/src/TransferListWidget.h b/src/TransferListWidget.h index 7e451af3a..b6de5da87 100644 --- a/src/TransferListWidget.h +++ b/src/TransferListWidget.h @@ -101,6 +101,7 @@ public slots: void hidePriorityColumn(bool hide); void displayDLHoSMenu(const QPoint&); void applyFilter(int f); + void updateTorrentSizeAndProgress(QString hash); signals: void currentTorrentChanged(QTorrentHandle &h); diff --git a/src/arborescence.h b/src/arborescence.h index 5b6ff0f87..bad1919a9 100644 --- a/src/arborescence.h +++ b/src/arborescence.h @@ -41,7 +41,7 @@ private: torrent_file *parent; bool is_dir; QString rel_path; - QList children; + QList children; size_type size; float progress; int priority; @@ -63,6 +63,19 @@ public: qDeleteAll(children); } + void updateProgress(std::vector fp) { + progress = fp[index]/size; + Q_ASSERT(progress >= 0.); + Q_ASSERT(progress <= 1.); + // Update children + foreach(torrent_file* child, children) { + child->updateProgress(fp); + } + if(parent) { + parent->updateProgress(); + } + } + QString path() const { return rel_path; } @@ -90,7 +103,7 @@ public: void updatePriority(int prio) { Q_ASSERT(is_dir); - foreach(const torrent_file *child, children) { + foreach(torrent_file *child, children) { if(child->getPriority() != prio) return; } priority = prio; @@ -120,13 +133,13 @@ public: return (!children.isEmpty()); } - QList getChildren() const { + QList getChildren() const { return children; } - const torrent_file* getChild(QString fileName) const { + torrent_file* getChild(QString fileName) const { Q_ASSERT(is_dir); - foreach(const torrent_file *f, children) { + foreach(torrent_file *f, children) { if(f->name() == fileName) return f; } return 0; @@ -225,6 +238,10 @@ public: delete root; } + void updateFileProgress(std::vector fp) { + root->updateProgress(fp); + } + torrent_file* getRoot() const { return root; } diff --git a/src/properties.ui b/src/properties.ui deleted file mode 100644 index 2f83b0d11..000000000 --- a/src/properties.ui +++ /dev/null @@ -1,1080 +0,0 @@ - - - properties - - - - 0 - 0 - 594 - 621 - - - - Torrent Properties - - - - 6 - - - 9 - - - - - 0 - - - - Main info - - - - - - - 16777215 - 20 - - - - - Sans Serif - 9 - 75 - false - true - false - false - - - - - - - Qt::AlignCenter - - - - - - - Qt::Horizontal - - - - - - - - 75 - true - - - - Torrent information - - - - - - - - 6 - - - 0 - - - - - - 0 - 29 - - - - - 75 - true - - - - Save path: - - - - - - - - 0 - 28 - - - - - 75 - true - - - - Creator: - - - - - - - - 0 - 29 - - - - - 75 - true - - - - Torrent hash: - - - - - - - - 0 - 128 - - - - - 16777215 - 120 - - - - - 75 - true - - - - Comment: - - - - - - - - - - - - - - 0 - 29 - - - - - - - - - - - - 21 - 0 - - - - - 21 - 16777215 - - - - ... - - - - - - - - - - 0 - 28 - - - - - - - - - - - - 0 - 29 - - - - - - - - - - - - 16777215 - 120 - - - - false - - - true - - - false - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - 0 - 50 - - - - - 75 - true - - - - Downloaded pieces - - - - - - - - 0 - 0 - - - - - 0 - 115 - - - - - Sans Serif - 9 - 75 - false - true - false - false - - - - Current session - - - - 6 - - - 9 - - - - - 6 - - - 0 - - - - - 6 - - - 0 - - - - - - Sans Serif - 9 - 50 - false - false - false - false - - - - Total uploaded: - - - - - - - - Sans Serif - 9 - 50 - false - false - false - false - - - - Total downloaded: - - - - - - - - Sans Serif - 9 - 50 - false - false - false - false - - - - Share ratio: - - - - - - - - Sans Serif - 9 - 50 - false - false - false - false - - - - Total failed: - - - - - - - - - 6 - - - 0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 181 - 20 - - - - - - - - - - - - - - Sans Serif - 9 - 50 - false - false - false - false - - - - Download in correct order (slower but good for previewing) - - - - - - - - Trackers - - - - - - 6 - - - 0 - - - - - - Sans Serif - 9 - 50 - false - false - false - false - - - - Trackers: - - - - - - - 6 - - - 0 - - - - - - 0 - 0 - - - - QAbstractItemView::ExtendedSelection - - - - - - - 6 - - - 0 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 24 - 24 - - - - - 24 - 24 - - - - - - - - - - - - 24 - 24 - - - - - 24 - 24 - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - 6 - - - 0 - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - 24 - 24 - - - - - 24 - 24 - - - - - - - - - - - - 24 - 24 - - - - - 24 - 24 - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - 6 - - - 0 - - - - - - 16777215 - 16 - - - - - Sans Serif - 9 - 50 - false - false - false - false - - - - Current tracker: - - - - - - - - 16777215 - 16 - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Vertical - - - QSizePolicy::Minimum - - - - 20 - 40 - - - - - - - - - Url seeds - - - - 6 - - - 9 - - - - - - 75 - true - - - - The following url seeds are available for this torrent: - - - - - - - - - - 6 - - - 0 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 24 - 24 - - - - - - - - - - - - 24 - 24 - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - Torrent content - - - - - - - Sans Serif - 9 - 75 - false - true - false - false - - - - Files contained in current torrent: - - - - - - - - 0 - 301 - - - - Qt::CustomContextMenu - - - QAbstractItemView::AllEditTriggers - - - QAbstractItemView::ExtendedSelection - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Collapse all - - - - - - - Expand all - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Sans Serif - 8 - 50 - false - false - false - false - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - true - - - - - - - - - - - 6 - - - 0 - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - OK - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Ignored - - - - - Normal - - - - - Maximum - - - - - High - - - - - - - okButton - clicked() - properties - accept() - - - 306 - 556 - - - 96 - 254 - - - - - diff --git a/src/properties_imp.cpp b/src/properties_imp.cpp deleted file mode 100644 index efe99c0ae..000000000 --- a/src/properties_imp.cpp +++ /dev/null @@ -1,739 +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 - */ - -#include "properties_imp.h" -#include "misc.h" -#include "PropListDelegate.h" -#include "bittorrent.h" -#include "arborescence.h" -#include "realprogressbar.h" -#include "realprogressbarthread.h" -#include "TrackersAdditionDlg.h" -#include "torrentPersistentData.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// Constructor -properties::properties(QWidget *parent, bittorrent *BTSession, QTorrentHandle &h): QDialog(parent), h(h), BTSession(BTSession), changedFilteredfiles(false), hash(h.hash()) { - setupUi(this); - lbl_priorities->setText(tr("Priorities:")+"
    • "+tr("Ignored: file is not downloaded at all")+"
    • "+tr("Normal: normal priority. Download order is dependent on availability")+"
    • "+tr("High: higher than normal priority. Pieces are preferred over pieces with the same availability, but not over pieces with lower availability")+"
    • "+tr("Maximum: maximum priority, availability is disregarded, the piece is preferred over any other piece with lower priority")+"
    "); - // set icons - addTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-add.png"))); - removeTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-remove.png"))); - lowerTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/downarrow.png"))); - riseTracker_button->setIcon(QIcon(QString::fromUtf8(":/Icons/uparrow.png"))); - addWS_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-add.png"))); - deleteWS_button->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/list-remove.png"))); - setAttribute(Qt::WA_DeleteOnClose); - // Set Properties list model - PropListModel = new QStandardItemModel(0,5); - PropListModel->setHeaderData(NAME, Qt::Horizontal, tr("File name")); - PropListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); - PropListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress")); - PropListModel->setHeaderData(PRIORITY, Qt::Horizontal, tr("Priority")); - filesList->setModel(PropListModel); - filesList->hideColumn(INDEX); - PropDelegate = new PropListDelegate(0, &changedFilteredfiles); - filesList->setItemDelegate(PropDelegate); - connect(filesList, SIGNAL(clicked(const QModelIndex&)), filesList, SLOT(edit(const QModelIndex&))); - connect(collapseAllButton, SIGNAL(clicked()), filesList, SLOT(collapseAll())); - connect(expandAllButton, SIGNAL(clicked()), filesList, SLOT(expandAll())); - connect(filesList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFilesListMenu(const QPoint&))); - connect(addTracker_button, SIGNAL(clicked()), this, SLOT(askForTracker())); - connect(removeTracker_button, SIGNAL(clicked()), this, SLOT(deleteSelectedTrackers())); - connect(riseTracker_button, SIGNAL(clicked()), this, SLOT(riseSelectedTracker())); - connect(lowerTracker_button, SIGNAL(clicked()), this, SLOT(lowerSelectedTracker())); - connect(actionIgnored, SIGNAL(triggered()), this, SLOT(ignoreSelection())); - connect(actionNormal, SIGNAL(triggered()), this, SLOT(normalSelection())); - connect(actionHigh, SIGNAL(triggered()), this, SLOT(highSelection())); - connect(actionMaximum, SIGNAL(triggered()), this, SLOT(maximumSelection())); - connect(addWS_button, SIGNAL(clicked()), this, SLOT(askWebSeed())); - connect(deleteWS_button, SIGNAL(clicked()), this, SLOT(deleteSelectedUrlSeeds())); - // get Infos from torrent handle - fileName->setText(h.name()); - // Torrent Infos - save_path->setText(TorrentPersistentData::getSavePath(hash)); - QString author = h.creator().trimmed(); - if(author.isEmpty()) - author = tr("Unknown"); - creator->setText(author); - hash_lbl->setText(hash); - comment_txt->setText(h.comment()); - //Trackers - loadTrackers(); - // Session infos - failed->setText(misc::friendlyUnit(h.total_failed_bytes())); - upTotal->setText(misc::friendlyUnit(h.total_payload_upload())); - dlTotal->setText(misc::friendlyUnit(h.total_payload_download())); - // Update ratio info - float ratio; - if(h.total_payload_download() == 0){ - if(h.total_payload_upload() == 0) - ratio = 1.; - else - ratio = 10.; // Max ratio - }else{ - ratio = (double)h.total_payload_upload()/(double)h.total_payload_download(); - if(ratio > 10.){ - ratio = 10.; - } - } - shareRatio->setText(QString(QByteArray::number(ratio, 'f', 1))); - std::vector fp; - h.file_progress(fp); - std::vector files_priority = loadFilesPriorities(); - // List files in torrent - h.get_torrent_info(); - arborescence *arb = new arborescence(h.get_torrent_info(), fp, files_priority); - addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem()); - delete arb; - connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); - filesList->expandAll(); - // List web seeds - loadWebSeedsFromFile(); - loadWebSeeds(); - // Incremental download - incrementalDownload->setChecked(TorrentPersistentData::isSequentialDownload(hash)); - updateInfosTimer = new QTimer(this); - connect(updateInfosTimer, SIGNAL(timeout()), this, SLOT(updateInfos())); - updateInfosTimer->start(3000); - progressBar = new RealProgressBar(this); - progressBar->setForegroundColor(Qt::blue); - progressBarVbox = new QVBoxLayout(RealProgressBox); - progressBarVbox->addWidget(progressBar); - progressBarUpdater = new RealProgressBarThread(progressBar, h); - progressBarUpdater->start(); - // progressBarUpdater->refresh(); - connect(updateInfosTimer, SIGNAL(timeout()), progressBarUpdater, SLOT(refresh())); - loadSettings(); -} - -properties::~properties(){ - writeSettings(); - qDebug("Properties destroyed"); - delete updateInfosTimer; - delete PropDelegate; - delete PropListModel; - delete progressBarUpdater; - delete progressBar; - delete progressBarVbox; -} - -void properties::addFilesToTree(const torrent_file *root, QStandardItem *parent) { - QList child; - // Name - QStandardItem *first; - if(root->isDir()) { - first = new QStandardItem(QIcon(":/Icons/oxygen/folder.png"), root->name()); - } else { - first = new QStandardItem(QIcon(":/Icons/oxygen/file.png"), root->name()); - } - child << first; - // Size - child << new QStandardItem(misc::toQString(root->getSize())); - // Progress - child << new QStandardItem(misc::toQString(root->getProgress())); - // Prio - child << new QStandardItem(misc::toQString(root->getPriority())); - // INDEX - child << new QStandardItem(misc::toQString(root->getIndex())); - // Add the child to the tree - parent->appendRow(child); - // Set row color - if(root->getPriority() == IGNORED) - setItemColor(first->index(), "red"); - else - setItemColor(first->index(), "green"); - // Add childs - foreach(const torrent_file *childFile, root->getChildren()) { - addFilesToTree(childFile, first); - } -} - -void properties::writeSettings() { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - settings.beginGroup(QString::fromUtf8("PropWindow")); - settings.setValue(QString::fromUtf8("size"), size()); - settings.setValue(QString::fromUtf8("pos"), pos()); - QVariantList contentColsWidths; - for(int i=0; icolumnCount()-1; ++i) { - contentColsWidths.append(filesList->columnWidth(i)); - } - settings.setValue(QString::fromUtf8("contentColsWidths"), contentColsWidths); - settings.endGroup(); -} - -void properties::loadSettings() { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - resize(settings.value(QString::fromUtf8("PropWindow/size"), size()).toSize()); - move(settings.value(QString::fromUtf8("PropWindow/pos"), screenCenter()).toPoint()); - QVariantList contentColsWidths = settings.value(QString::fromUtf8("PropWindow/contentColsWidths"), QVariantList()).toList(); - if(contentColsWidths.empty()) { - filesList->header()->resizeSection(NAME, 200); - } else { - for(int i=0; isetColumnWidth(i, contentColsWidths.at(i).toInt()); - } - } -} - -// Center window -QPoint properties::screenCenter() const{ - int scrn = 0; - QWidget *w = this->topLevelWidget(); - - if(w) - scrn = QApplication::desktop()->screenNumber(w); - else if(QApplication::desktop()->isVirtualDesktop()) - scrn = QApplication::desktop()->screenNumber(QCursor::pos()); - else - scrn = QApplication::desktop()->screenNumber(this); - - QRect desk(QApplication::desktop()->availableGeometry(scrn)); - return QPoint((desk.width() - this->frameGeometry().width()) / 2, (desk.height() - this->frameGeometry().height()) / 2); -} - -// priority is the new priority of given item -void properties::updateParentsPriority(QStandardItem *item, int priority) { - QStandardItem *parent = item->parent(); - if(!parent) return; - // Check if children have different priorities - // then folder must have NORMAL priority - unsigned int rowCount = parent->rowCount(); - for(unsigned int i=0; ichild(i, PRIORITY)->text().toInt() != priority) { - QStandardItem *grandFather = parent->parent(); - if(!grandFather) { - grandFather = PropListModel->invisibleRootItem(); - } - QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY); - if(parentPrio->text().toInt() != NORMAL) { - parentPrio->setText(misc::toQString(NORMAL)); - setItemColor(parentPrio->index(), "green"); - // Recursively update ancesters of this parent too - updateParentsPriority(grandFather->child(parent->row()), priority); - } - return; - } - } - // All the children have the same priority - // Parent folder should have the same priority too - QStandardItem *grandFather = parent->parent(); - if(!grandFather) { - grandFather = PropListModel->invisibleRootItem(); - } - QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY); - if(parentPrio->text().toInt() != priority) { - parentPrio->setText(misc::toQString(priority)); - if(priority == IGNORED) - setItemColor(parentPrio->index(), "red"); - else - setItemColor(parentPrio->index(), "green"); - // Recursively update ancesters of this parent too - updateParentsPriority(grandFather->child(parent->row()), priority); - } -} - -void properties::updateChildrenPriority(QStandardItem *item, int priority) { - QStandardItem *parent = item->parent(); - if(!parent) { - parent = PropListModel->invisibleRootItem(); - } - parent = parent->child(item->row()); - unsigned int rowCount = parent->rowCount(); - for(unsigned int i=0; ichild(i, PRIORITY); - if(childPrio->text().toInt() != priority) { - childPrio->setText(misc::toQString(priority)); - if(priority == IGNORED) - setItemColor(childPrio->index(), "red"); - else - setItemColor(childPrio->index(), "green"); - // recursively update children of this child too - updateChildrenPriority(parent->child(i), priority); - } - } -} - -void properties::updatePriorities(QStandardItem *item) { - qDebug("Priority changed"); - // First we disable the signal/slot on item edition - // temporarily so that it doesn't mess with our manual updates - disconnect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); - QStandardItem *parent = item->parent(); - if(!parent) { - parent = PropListModel->invisibleRootItem(); - } - int priority = parent->child(item->row(), PRIORITY)->text().toInt(); - if(priority == IGNORED) - setItemColor(item->index(), "red"); - else - setItemColor(item->index(), "green"); - // Update parents priorities - updateParentsPriority(item, priority); - // If this is not a directory, then there are - // no children to update - if(parent->child(item->row(), INDEX)->text().toInt() == -1) { - // Updating children - qDebug("Priority changed for a folder to %d", priority); - updateChildrenPriority(item, priority); - } - // Reconnect the signal/slot on item edition so that we - // get future updates - connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); -} - -void properties::loadWebSeeds(){ - // Clear url seeds list - listWebSeeds->clear(); - // Add manually added url seeds - foreach(const QString &url_seed, urlSeeds){ - listWebSeeds->addItem(url_seed); - qDebug("Added custom url seed to list: %s", url_seed.toLocal8Bit().data()); - } -} - -std::vector properties::loadFilesPriorities(){ - std::vector fp; - QVariantList files_priority = TorrentPersistentData::getFilesPriority(hash); - if(files_priority.empty()) { - for(int i=0; i 7){ - // Normal priority as default - priority = 1; - } - fp.push_back(priority); - } - } - return fp; -} - -bool properties::allFiltered() const { - unsigned int nbRows = PropListModel->rowCount(); - for(unsigned int i=0; idata(PropListModel->index(i, PRIORITY)).toInt() != IGNORED) - return false; - } - return true; -} - - -void properties::getPriorities(QStandardItem *parent, int *priorities) { - qDebug("In getPriorities"); - unsigned int nbRows = parent->rowCount(); - for(unsigned int i=0; ichild(i, INDEX); - int index = item->text().toInt(); - if(index < 0) { - getPriorities(parent->child(i, NAME), priorities); - } else { - item = parent->child(i, PRIORITY); - priorities[index] = item->text().toInt(); - qDebug("File at index %d has priority %d", index, priorities[index]); - } - } -} - -void properties::displayFilesListMenu(const QPoint&){ - if(h.get_torrent_info().num_files() == 1) return; - QMenu myFilesLlistMenu(this); - QModelIndex index; - // Enable/disable pause/start action given the DL state - QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); - myFilesLlistMenu.setTitle(tr("Priority")); - myFilesLlistMenu.addAction(actionIgnored); - myFilesLlistMenu.addAction(actionNormal); - myFilesLlistMenu.addAction(actionHigh); - myFilesLlistMenu.addAction(actionMaximum); - // Call menu - myFilesLlistMenu.exec(QCursor::pos()); -} - -void properties::ignoreSelection(){ - QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == PRIORITY){ - if(PropListModel->data(index) != QVariant(IGNORED)){ - PropListModel->setData(index, QVariant(IGNORED)); - changedFilteredfiles = true; - setItemColor(index, "red"); - } - } - } -} - -void properties::normalSelection(){ - QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == PRIORITY){ - if(PropListModel->data(index) != QVariant(NORMAL)){ - PropListModel->setData(index, QVariant(NORMAL)); - changedFilteredfiles = true; - setItemColor(index, "green"); - } - } - } -} - -void properties::highSelection(){ - QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == PRIORITY){ - if(PropListModel->data(index) != QVariant(HIGH)){ - PropListModel->setData(index, QVariant(HIGH)); - changedFilteredfiles = true; - setItemColor(index, "green"); - } - } - } -} - -void properties::maximumSelection(){ - QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); - foreach(const QModelIndex &index, selectedIndexes){ - if(index.column() == PRIORITY){ - if(PropListModel->data(index) != QVariant(MAXIMUM)){ - PropListModel->setData(index, QVariant(MAXIMUM)); - changedFilteredfiles = true; - setItemColor(index, "green"); - } - } - } -} - -void properties::loadTrackers(){ - //Trackers - std::vector trackers = h.trackers(); - trackersURLS->clear(); - QHash errors = BTSession->getTrackersErrors(h.hash()); - unsigned int nbTrackers = trackers.size(); - for(unsigned int i=0; isetForeground(QBrush(QColor("red"))); - // Set tooltip - QString msg=""; - unsigned int i=0; - foreach(QString word, errors[current_tracker].split(" ")) { - if(i > 0 && i%5!=1) msg += " "; - msg += word; - if(i> 0 && i%5==0) msg += "\n"; - ++i; - } - item->setToolTip(msg); - } else { - item->setForeground(QBrush(QColor("green"))); - } - } - QString tracker = h.current_tracker().trimmed(); - if(!tracker.isEmpty()){ - trackerURL->setText(tracker); - }else{ - trackerURL->setText(tr("None - Unreachable?")); - } -} - -void properties::askWebSeed(){ - bool ok; - // Ask user for a new url seed - QString url_seed = QInputDialog::getText(this, tr("New url seed", "New HTTP source"), - tr("New url seed:"), QLineEdit::Normal, - QString::fromUtf8("http://www."), &ok); - if(!ok) return; - qDebug("Adding %s web seed", url_seed.toLocal8Bit().data()); - if(urlSeeds.indexOf(url_seed) != -1) { - QMessageBox::warning(this, tr("qBittorrent"), - tr("This url seed is already in the list."), - QMessageBox::Ok); - return; - } - urlSeeds << url_seed; - h.add_url_seed(url_seed); - TorrentPersistentData::saveUrlSeeds(h); - // Refresh the seeds list - loadWebSeeds(); -} - -// Ask the user for a new tracker -// and add it to the download list -// if it is not already in it -void properties::askForTracker(){ - TrackersAddDlg *dlg = new TrackersAddDlg(this); - connect(dlg, SIGNAL(TrackersToAdd(QStringList)), this, SLOT(addTrackerList(QStringList))); -} - -void properties::addTrackerList(QStringList myTrackers) { - // Add the trackers to the list - std::vector trackers = h.trackers(); - foreach(const QString& tracker, myTrackers) { - announce_entry new_tracker(misc::toString(tracker.trimmed().toLocal8Bit().data())); - new_tracker.tier = 0; // Will be fixed a bit later - trackers.push_back(new_tracker); - misc::fixTrackersTiers(trackers); - } - h.replace_trackers(trackers); - h.force_reannounce(); - // Reload Trackers - loadTrackers(); - emit trackersChanged(h.hash()); -} - -void properties::deleteSelectedUrlSeeds(){ - QList selectedItems = listWebSeeds->selectedItems(); - bool change = false; - foreach(QListWidgetItem *item, selectedItems){ - QString url_seed = item->text(); - int index = urlSeeds.indexOf(url_seed); - Q_ASSERT(index != -1); - urlSeeds.removeAt(index); - h.remove_url_seed(url_seed); - change = true; - } - if(change){ - // Save them to disk - TorrentPersistentData::saveUrlSeeds(h); - // Refresh list - loadWebSeeds(); - } -} - -void properties::deleteSelectedTrackers(){ - QList selectedItems = trackersURLS->selectedItems(); - if(!selectedItems.size()) return; - std::vector trackers = h.trackers(); - unsigned int nbTrackers = trackers.size(); - if(nbTrackers == (unsigned int) selectedItems.size()){ - QMessageBox::warning(this, tr("qBittorrent"), - tr("Trackers list can't be empty."), - QMessageBox::Ok); - return; - } - foreach(QListWidgetItem *item, selectedItems){ - QString url = item->text(); - for(unsigned int i=0; i trackers = h.trackers(); - QList selectedItems = trackersURLS->selectedItems(); - bool change = false; - unsigned int nbTrackers = trackers.size(); - foreach(QListWidgetItem *item, selectedItems){ - QString url = item->text(); - for(i=0; i 0){ - announce_entry tmp = trackers[i]; - trackers[i] = trackers[i-1]; - trackers[i-1] = tmp; - change = true; - } - break; - } - } - } - if(change){ - misc::fixTrackersTiers(trackers); - h.replace_trackers(trackers); - h.force_reannounce(); - // Reload Trackers - loadTrackers(); - trackersURLS->item(i-1)->setSelected(true); - emit trackersChanged(h.hash()); - } -} - -void properties::lowerSelectedTracker(){ - unsigned int i = 0; - std::vector trackers = h.trackers(); - QList selectedItems = trackersURLS->selectedItems(); - bool change = false; - unsigned int nbTrackers = trackers.size(); - foreach(QListWidgetItem *item, selectedItems){ - QString url = item->text(); - for(i=0; iitem(i+1)->setSelected(true); - emit trackersChanged(h.hash()); - } -} - -void properties::updateInfos(){ - // Update current tracker - try { - QString tracker = h.current_tracker().trimmed(); - if(!tracker.isEmpty()){ - trackerURL->setText(tracker); - }else{ - trackerURL->setText(tr("None - Unreachable?")); - } - // XXX: This causes selection problems - //loadTrackers(); - }catch(invalid_handle e){ - // torrent was removed, closing properties - close(); - } -} - -void properties::setItemColor(QModelIndex index, QString color){ - for(int i=0; icolumnCount(); ++i){ - PropListModel->setData(index.sibling(index.row(), i), QVariant(QColor(color)), Qt::ForegroundRole); - } -} - -void properties::on_incrementalDownload_stateChanged(int state){ - qDebug("Incremental download toggled"); - if(state == Qt::Checked){ - if(!TorrentPersistentData::isSequentialDownload(hash)) { - h.set_sequential_download(true); - TorrentPersistentData::saveSequentialStatus(h); - } - }else{ - h.set_sequential_download(false); - TorrentPersistentData::saveSequentialStatus(h); - } -} - -void properties::on_changeSavePathButton_clicked() { - QString dir; - QDir saveDir(h.save_path()); - if(saveDir.exists()){ - dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), h.save_path()); - }else{ - dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), QDir::homePath()); - } - if(!dir.isNull()){ - // Check if savePath exists - QDir savePath(dir); - if(!savePath.exists()){ - if(!savePath.mkpath(savePath.path())){ - QMessageBox::critical(0, tr("Save path creation error"), tr("Could not create the save path")); - return; - } - } - // Save savepath - TorrentPersistentData::saveSavePath(hash, savePath.path()); - // Actually move storage - if(!BTSession->useTemporaryFolder() || h.is_seed()) - h.move_storage(savePath.path()); - // Update save_path in dialog - save_path->setText(savePath.path()); - } -} - -void properties::on_okButton_clicked(){ - if(savePiecesPriorities()) - close(); -} - -void properties::loadWebSeedsFromFile(){ - urlSeeds.clear(); - QVariantList url_seeds = TorrentPersistentData::getUrlSeeds(hash); - foreach(const QVariant &var_url_seed, url_seeds){ - QString url_seed = var_url_seed.toString(); - if(!url_seed.isEmpty()) - urlSeeds << url_seed; - } - // Load the hard-coded url seeds - QStringList hc_seeds = h.url_seeds(); - // Add hard coded url seeds - foreach(const QString &hc_seed, hc_seeds){ - if(urlSeeds.indexOf(hc_seed) == -1){ - urlSeeds << hc_seed; - } - } -} - -bool properties::savePiecesPriorities() { - if(!changedFilteredfiles) return true; - if(allFiltered()) { - QMessageBox::warning(0, tr("Priorities error"), tr("Error, you can't filter all the files in a torrent.")); - return false; - } - qDebug("Saving pieces priorities"); - int *priorities = new int[h.get_torrent_info().num_files()]; - getPriorities(PropListModel->invisibleRootItem(), priorities); - unsigned int nbFiles = h.get_torrent_info().num_files(); - for(unsigned int i=0; i loadFilesPriorities(); - - protected: - QPoint screenCenter() const; -}; - -#endif diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index a784650b3..82d667ed2 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -30,15 +30,25 @@ #include #include +#include +#include #include #include #include +#include +#include +#include +#include +#include #include "propertieswidget.h" #include "TransferListWidget.h" #include "torrentPersistentData.h" #include "realprogressbar.h" #include "realprogressbarthread.h" +#include "arborescence.h" #include "bittorrent.h" +#include "PropListDelegate.h" +#include "TrackersAdditionDlg.h" #define DEFAULT_BUTTON_CSS "QPushButton {border: 1px solid rgb(85, 81, 91);border-radius: 3px;padding: 2px;}" #define SELECTED_BUTTON_CSS "QPushButton {border: 1px solid rgb(85, 81, 91);border-radius: 3px;padding: 2px;background-color: rgb(255, 208, 105);}" @@ -54,15 +64,51 @@ PropertiesWidget::PropertiesWidget(QWidget *parent, TransferListWidget *transfer setEnabled(false); } + // Set Properties list model + PropListModel = new QStandardItemModel(0,5); + PropListModel->setHeaderData(NAME, Qt::Horizontal, tr("File name")); + PropListModel->setHeaderData(SIZE, Qt::Horizontal, tr("Size")); + PropListModel->setHeaderData(PROGRESS, Qt::Horizontal, tr("Progress")); + PropListModel->setHeaderData(PRIORITY, Qt::Horizontal, tr("Priority")); + filesList->setModel(PropListModel); + filesList->hideColumn(INDEX); + PropDelegate = new PropListDelegate(0); + filesList->setItemDelegate(PropDelegate); + + // QActions + actionIgnored = new QAction(this); + actionNormal = new QAction(this); + actionMaximum = new QAction(this); + actionHigh = new QAction(this); + + // SIGNAL/SLOTS + connect(filesList, SIGNAL(clicked(const QModelIndex&)), filesList, SLOT(edit(const QModelIndex&))); + connect(collapseAllButton, SIGNAL(clicked()), filesList, SLOT(collapseAll())); + connect(expandAllButton, SIGNAL(clicked()), filesList, SLOT(expandAll())); + connect(filesList, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(displayFilesListMenu(const QPoint&))); + connect(addTracker_button, SIGNAL(clicked()), this, SLOT(askForTracker())); + connect(removeTracker_button, SIGNAL(clicked()), this, SLOT(deleteSelectedTrackers())); + connect(riseTracker_button, SIGNAL(clicked()), this, SLOT(riseSelectedTracker())); + connect(lowerTracker_button, SIGNAL(clicked()), this, SLOT(lowerSelectedTracker())); + connect(actionIgnored, SIGNAL(triggered()), this, SLOT(ignoreSelection())); + connect(actionNormal, SIGNAL(triggered()), this, SLOT(normalSelection())); + connect(actionHigh, SIGNAL(triggered()), this, SLOT(highSelection())); + connect(actionMaximum, SIGNAL(triggered()), this, SLOT(maximumSelection())); + connect(addWS_button, SIGNAL(clicked()), this, SLOT(askWebSeed())); + connect(deleteWS_button, SIGNAL(clicked()), this, SLOT(deleteSelectedUrlSeeds())); connect(transferList, SIGNAL(currentTorrentChanged(QTorrentHandle&)), this, SLOT(loadTorrentInfos(QTorrentHandle &))); connect(incrementalDownload, SIGNAL(stateChanged(int)), this, SLOT(setIncrementalDownload(int))); + connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); + connect(PropDelegate, SIGNAL(filteredFilesChanged()), this, SLOT(filteredFilesChanged())); // Downloaded pieces progress bar progressBar = new RealProgressBar(this); progressBar->setForegroundColor(Qt::blue); progressBarVbox = new QVBoxLayout(RealProgressBox); progressBarVbox->addWidget(progressBar); + // Pointers init progressBarUpdater = 0; + arb = 0; // Dynamic data refresher refreshTimer = new QTimer(this); connect(refreshTimer, SIGNAL(timeout()), this, SLOT(loadDynamicData())); @@ -77,6 +123,14 @@ PropertiesWidget::~PropertiesWidget() { delete progressBarUpdater; delete progressBar; delete progressBarVbox; + delete PropListModel; + if(arb) + delete arb; + // Delete QActions + delete actionIgnored; + delete actionNormal; + delete actionMaximum; + delete actionHigh; } void PropertiesWidget::reduce() { @@ -116,9 +170,14 @@ void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { return; } setEnabled(true); - if(progressBarUpdater) + if(progressBarUpdater) { delete progressBarUpdater; - progressBarUpdater = 0; + progressBarUpdater = 0; + } + if(arb != 0) { + delete arb; + arb = 0; + } try { // Save path save_path->setText(TorrentPersistentData::getSavePath(h.hash())); @@ -140,6 +199,13 @@ void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { // downloaded pieces updater progressBarUpdater = new RealProgressBarThread(progressBar, h); progressBarUpdater->start(); + // Create arborescence (Tree representation of files in the torrent) + std::vector fp; + h.file_progress(fp); + std::vector files_priority = loadFilesPriorities(); + // List files in torrent + arborescence *arb = new arborescence(h.get_torrent_info(), fp, files_priority); + addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem()); } catch(invalid_handle e) { } @@ -293,3 +359,428 @@ void PropertiesWidget::on_files_button_clicked() { files_button->setStyleSheet(SELECTED_BUTTON_CSS); } } + +// priority is the new priority of given item +void PropertiesWidget::updateParentsPriority(QStandardItem *item, int priority) { + QStandardItem *parent = item->parent(); + if(!parent) return; + // Check if children have different priorities + // then folder must have NORMAL priority + unsigned int rowCount = parent->rowCount(); + for(unsigned int i=0; ichild(i, PRIORITY)->text().toInt() != priority) { + QStandardItem *grandFather = parent->parent(); + if(!grandFather) { + grandFather = PropListModel->invisibleRootItem(); + } + QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY); + if(parentPrio->text().toInt() != NORMAL) { + parentPrio->setText(misc::toQString(NORMAL)); + setItemColor(parentPrio->index(), "green"); + // Recursively update ancesters of this parent too + updateParentsPriority(grandFather->child(parent->row()), priority); + } + return; + } + } + // All the children have the same priority + // Parent folder should have the same priority too + QStandardItem *grandFather = parent->parent(); + if(!grandFather) { + grandFather = PropListModel->invisibleRootItem(); + } + QStandardItem *parentPrio = grandFather->child(parent->row(), PRIORITY); + if(parentPrio->text().toInt() != priority) { + parentPrio->setText(misc::toQString(priority)); + if(priority == IGNORED) + setItemColor(parentPrio->index(), "red"); + else + setItemColor(parentPrio->index(), "green"); + // Recursively update ancesters of this parent too + updateParentsPriority(grandFather->child(parent->row()), priority); + } +} + +void PropertiesWidget::updateChildrenPriority(QStandardItem *item, int priority) { + QStandardItem *parent = item->parent(); + if(!parent) { + parent = PropListModel->invisibleRootItem(); + } + parent = parent->child(item->row()); + unsigned int rowCount = parent->rowCount(); + for(unsigned int i=0; ichild(i, PRIORITY); + if(childPrio->text().toInt() != priority) { + childPrio->setText(misc::toQString(priority)); + if(priority == IGNORED) + setItemColor(childPrio->index(), "red"); + else + setItemColor(childPrio->index(), "green"); + // recursively update children of this child too + updateChildrenPriority(parent->child(i), priority); + } + } +} + +void PropertiesWidget::updatePriorities(QStandardItem *item) { + qDebug("Priority changed"); + // First we disable the signal/slot on item edition + // temporarily so that it doesn't mess with our manual updates + disconnect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); + QStandardItem *parent = item->parent(); + if(!parent) { + parent = PropListModel->invisibleRootItem(); + } + int priority = parent->child(item->row(), PRIORITY)->text().toInt(); + if(priority == IGNORED) + setItemColor(item->index(), "red"); + else + setItemColor(item->index(), "green"); + // Update parents priorities + updateParentsPriority(item, priority); + // If this is not a directory, then there are + // no children to update + if(parent->child(item->row(), INDEX)->text().toInt() == -1) { + // Updating children + qDebug("Priority changed for a folder to %d", priority); + updateChildrenPriority(item, priority); + } + // Reconnect the signal/slot on item edition so that we + // get future updates + connect(PropListModel, SIGNAL(itemChanged(QStandardItem*)), this, SLOT(updatePriorities(QStandardItem*))); +} + +std::vector PropertiesWidget::loadFilesPriorities(){ + std::vector fp; + QVariantList files_priority = TorrentPersistentData::getFilesPriority(h.hash()); + if(files_priority.empty()) { + for(int i=0; i 7){ + // Normal priority as default + priority = 1; + } + fp.push_back(priority); + } + } + return fp; +} + +bool PropertiesWidget::allFiltered() const { + unsigned int nbRows = PropListModel->rowCount(); + for(unsigned int i=0; idata(PropListModel->index(i, PRIORITY)).toInt() != IGNORED) + return false; + } + return true; +} + + +void PropertiesWidget::getPriorities(QStandardItem *parent, int *priorities) { + qDebug("In getPriorities"); + unsigned int nbRows = parent->rowCount(); + for(unsigned int i=0; ichild(i, INDEX); + int index = item->text().toInt(); + if(index < 0) { + getPriorities(parent->child(i, NAME), priorities); + } else { + item = parent->child(i, PRIORITY); + priorities[index] = item->text().toInt(); + qDebug("File at index %d has priority %d", index, priorities[index]); + } + } +} + +void PropertiesWidget::displayFilesListMenu(const QPoint&){ + if(h.get_torrent_info().num_files() == 1) return; + QMenu myFilesLlistMenu(this); + QModelIndex index; + // Enable/disable pause/start action given the DL state + QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); + myFilesLlistMenu.setTitle(tr("Priority")); + myFilesLlistMenu.addAction(actionIgnored); + myFilesLlistMenu.addAction(actionNormal); + myFilesLlistMenu.addAction(actionHigh); + myFilesLlistMenu.addAction(actionMaximum); + // Call menu + myFilesLlistMenu.exec(QCursor::pos()); +} + +void PropertiesWidget::ignoreSelection(){ + QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + if(PropListModel->data(index) != QVariant(IGNORED)){ + PropListModel->setData(index, QVariant(IGNORED)); + transferList->updateTorrentSizeAndProgress(h.hash()); + setItemColor(index, "red"); + } + } + } +} + +void PropertiesWidget::normalSelection(){ + QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + if(PropListModel->data(index) != QVariant(NORMAL)){ + PropListModel->setData(index, QVariant(NORMAL)); + transferList->updateTorrentSizeAndProgress(h.hash()); + setItemColor(index, "green"); + } + } + } +} + +void PropertiesWidget::highSelection(){ + QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + if(PropListModel->data(index) != QVariant(HIGH)){ + PropListModel->setData(index, QVariant(HIGH)); + transferList->updateTorrentSizeAndProgress(h.hash()); + setItemColor(index, "green"); + } + } + } +} + +void PropertiesWidget::maximumSelection(){ + QModelIndexList selectedIndexes = filesList->selectionModel()->selectedIndexes(); + foreach(const QModelIndex &index, selectedIndexes){ + if(index.column() == PRIORITY){ + if(PropListModel->data(index) != QVariant(MAXIMUM)){ + PropListModel->setData(index, QVariant(MAXIMUM)); + transferList->updateTorrentSizeAndProgress(h.hash()); + setItemColor(index, "green"); + } + } + } +} + +void PropertiesWidget::askWebSeed(){ + bool ok; + // Ask user for a new url seed + QString url_seed = QInputDialog::getText(this, tr("New url seed", "New HTTP source"), + tr("New url seed:"), QLineEdit::Normal, + QString::fromUtf8("http://www."), &ok); + if(!ok) return; + qDebug("Adding %s web seed", url_seed.toLocal8Bit().data()); + if(!listWebSeeds->findItems(url_seed, Qt::MatchFixedString).empty()) { + QMessageBox::warning(this, tr("qBittorrent"), + tr("This url seed is already in the list."), + QMessageBox::Ok); + return; + } + h.add_url_seed(url_seed); + TorrentPersistentData::saveUrlSeeds(h); + // Refresh the seeds list + loadUrlSeeds(); +} + +// Ask the user for a new tracker +// and add it to the download list +// if it is not already in it +void PropertiesWidget::askForTracker(){ + TrackersAddDlg *dlg = new TrackersAddDlg(this); + connect(dlg, SIGNAL(TrackersToAdd(QStringList)), this, SLOT(addTrackerList(QStringList))); +} + +void PropertiesWidget::addTrackerList(QStringList myTrackers) { + // Add the trackers to the list + std::vector trackers = h.trackers(); + foreach(const QString& tracker, myTrackers) { + announce_entry new_tracker(misc::toString(tracker.trimmed().toLocal8Bit().data())); + new_tracker.tier = 0; // Will be fixed a bit later + trackers.push_back(new_tracker); + misc::fixTrackersTiers(trackers); + } + h.replace_trackers(trackers); + h.force_reannounce(); + // Reload Trackers + loadTrackers(); + BTSession->saveTrackerFile(h.hash()); +} + +void PropertiesWidget::deleteSelectedUrlSeeds(){ + QList selectedItems = listWebSeeds->selectedItems(); + bool change = false; + foreach(QListWidgetItem *item, selectedItems){ + QString url_seed = item->text(); + h.remove_url_seed(url_seed); + change = true; + } + if(change){ + // Save them to disk + TorrentPersistentData::saveUrlSeeds(h); + // Refresh list + loadUrlSeeds(); + } +} + +void PropertiesWidget::deleteSelectedTrackers(){ + QList selectedItems = trackersURLS->selectedItems(); + if(!selectedItems.size()) return; + std::vector trackers = h.trackers(); + unsigned int nbTrackers = trackers.size(); + if(nbTrackers == (unsigned int) selectedItems.size()){ + QMessageBox::warning(this, tr("qBittorrent"), + tr("Trackers list can't be empty."), + QMessageBox::Ok); + return; + } + foreach(QListWidgetItem *item, selectedItems){ + QString url = item->text(); + for(unsigned int i=0; isaveTrackerFile(h.hash()); +} + +void PropertiesWidget::riseSelectedTracker(){ + unsigned int i = 0; + std::vector trackers = h.trackers(); + QList selectedItems = trackersURLS->selectedItems(); + bool change = false; + unsigned int nbTrackers = trackers.size(); + foreach(QListWidgetItem *item, selectedItems){ + QString url = item->text(); + for(i=0; i 0){ + announce_entry tmp = trackers[i]; + trackers[i] = trackers[i-1]; + trackers[i-1] = tmp; + change = true; + } + break; + } + } + } + if(change){ + misc::fixTrackersTiers(trackers); + h.replace_trackers(trackers); + h.force_reannounce(); + // Reload Trackers + loadTrackers(); + trackersURLS->item(i-1)->setSelected(true); + BTSession->saveTrackerFile(h.hash()); + } +} + +void PropertiesWidget::lowerSelectedTracker(){ + unsigned int i = 0; + std::vector trackers = h.trackers(); + QList selectedItems = trackersURLS->selectedItems(); + bool change = false; + unsigned int nbTrackers = trackers.size(); + foreach(QListWidgetItem *item, selectedItems){ + QString url = item->text(); + for(i=0; iitem(i+1)->setSelected(true); + BTSession->saveTrackerFile(h.hash()); + } +} + +void PropertiesWidget::setItemColor(QModelIndex index, QString color){ + for(int i=0; icolumnCount(); ++i){ + PropListModel->setData(index.sibling(index.row(), i), QVariant(QColor(color)), Qt::ForegroundRole); + } +} + +void PropertiesWidget::on_changeSavePathButton_clicked() { + QString dir; + QDir saveDir(h.save_path()); + if(saveDir.exists()){ + dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), h.save_path()); + }else{ + dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), QDir::homePath()); + } + if(!dir.isNull()){ + // Check if savePath exists + QDir savePath(dir); + if(!savePath.exists()){ + if(!savePath.mkpath(savePath.path())){ + QMessageBox::critical(0, tr("Save path creation error"), tr("Could not create the save path")); + return; + } + } + // Save savepath + TorrentPersistentData::saveSavePath(h.hash(), savePath.path()); + // Actually move storage + if(!BTSession->useTemporaryFolder() || h.is_seed()) + h.move_storage(savePath.path()); + // Update save_path in dialog + save_path->setText(savePath.path()); + } +} + +void PropertiesWidget::filteredFilesChanged() { + if(h.is_valid()) + transferList->updateTorrentSizeAndProgress(h.hash()); +} + +void PropertiesWidget::addFilesToTree(torrent_file *root, QStandardItem *parent) { + QList child; + // Name + QStandardItem *first; + if(root->isDir()) { + first = new QStandardItem(QIcon(":/Icons/oxygen/folder.png"), root->name()); + } else { + first = new QStandardItem(QIcon(":/Icons/oxygen/file.png"), root->name()); + } + child << first; + // Size + child << new QStandardItem(misc::toQString(root->getSize())); + // Progress + child << new QStandardItem(misc::toQString(root->getProgress())); + // Prio + child << new QStandardItem(misc::toQString(root->getPriority())); + // INDEX + child << new QStandardItem(misc::toQString(root->getIndex())); + // Add the child to the tree + parent->appendRow(child); + // Set row color + if(root->getPriority() == IGNORED) + setItemColor(first->index(), "red"); + else + setItemColor(first->index(), "green"); + // Add childs + foreach(torrent_file *childFile, root->getChildren()) { + addFilesToTree(childFile, first); + } +} diff --git a/src/propertieswidget.h b/src/propertieswidget.h index d0a3ae1d7..6c563c2a1 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -41,6 +41,12 @@ class RealProgressBar; class QVBoxLayout; class RealProgressBarThread; class bittorrent; +class arborescence; +class QStandardItemModel; +class PropListDelegate; +class QStandardItem; +class QAction; +class torrent_file; enum Tab {MAIN_TAB, TRACKERS_TAB, URLSEEDS_TAB, FILES_TAB}; enum SlideState {REDUCED, VISIBLE}; @@ -57,9 +63,18 @@ private: QVBoxLayout *progressBarVbox; bittorrent* BTSession; SlideState state; + arborescence *arb; + QStandardItemModel *PropListModel; + PropListDelegate *PropDelegate; + QAction *actionIgnored; + QAction *actionNormal; + QAction *actionMaximum; + QAction *actionHigh; protected: QPushButton* getButtonFromIndex(int index); + std::vector loadFilesPriorities(); + bool allFiltered() const; protected slots: void loadTorrentInfos(QTorrentHandle &h); @@ -71,6 +86,26 @@ protected slots: void on_trackers_button_clicked(); void on_url_seeds_button_clicked(); void on_files_button_clicked(); + void updateChildrenPriority(QStandardItem *item, int priority); + void updateParentsPriority(QStandardItem *item, int priority); + void updatePriorities(QStandardItem *item); + void ignoreSelection(); + void normalSelection(); + void highSelection(); + void maximumSelection(); + void askWebSeed(); + void deleteSelectedUrlSeeds(); + void askForTracker(); + void deleteSelectedTrackers(); + void lowerSelectedTracker(); + void riseSelectedTracker(); + void displayFilesListMenu(const QPoint& pos); + void setItemColor(QModelIndex index, QString color); + void on_changeSavePathButton_clicked(); + void addFilesToTree(torrent_file *root, QStandardItem *parent); + void getPriorities(QStandardItem *parent, int *priorities); + void addTrackerList(QStringList myTrackers); + void filteredFilesChanged(); public slots: void reduce(); diff --git a/src/seeding.ui b/src/seeding.ui deleted file mode 100644 index 6cf5f042b..000000000 --- a/src/seeding.ui +++ /dev/null @@ -1,159 +0,0 @@ - - - seeding - - - - 0 - 0 - 811 - 453 - - - - Search - - - - 6 - - - 9 - - - - - Qt::CustomContextMenu - - - QAbstractItemView::ExtendedSelection - - - - - - - - true - - - - <u>Note:</u> It is important that you keep sharing your torrents after they are finished for the well being of the network. - - - - - - - Start - - - - - Pause - - - - - Delete - - - - - Delete Permanently - - - - - Torrent Properties - - - - - Preview file - - - - - Set upload limit - - - - - - :/Icons/oxygen/folder.png:/Icons/oxygen/folder.png - - - Open destination folder - - - - - Name - - - - - Size - - - - - Upload Speed - - - - - Connected peers - - - Connected peers - - - - - Ratio - - - - - - :/Icons/oxygen/wallet.png:/Icons/oxygen/wallet.png - - - Buy it - - - - - - :/Icons/oxygen/gear.png:/Icons/oxygen/gear.png - - - Force recheck - - - - - Total uploaded - - - - - Seeds / Leechers - - - Seeds / Leechers - - - - - Copy magnet link - - - - - - - - diff --git a/src/src.pro b/src/src.pro index 46288d5da..c393feda9 100644 --- a/src/src.pro +++ b/src/src.pro @@ -143,7 +143,6 @@ HEADERS += GUI.h \ misc.h \ options_imp.h \ about_imp.h \ - properties_imp.h \ createtorrent_imp.h \ SearchListDelegate.h \ PropListDelegate.h \ @@ -189,7 +188,6 @@ HEADERS += GUI.h \ FORMS += MainWindow.ui \ options.ui \ about.ui \ - properties.ui \ createtorrent.ui \ preview.ui \ login.ui \ @@ -197,7 +195,6 @@ FORMS += MainWindow.ui \ addTorrentDialog.ui \ search.ui \ rss.ui \ - seeding.ui \ bandwidth_limit.ui \ engineSelect.ui \ pluginSource.ui \ @@ -208,7 +205,6 @@ FORMS += MainWindow.ui \ SOURCES += GUI.cpp \ main.cpp \ options_imp.cpp \ - properties_imp.cpp \ createtorrent_imp.cpp \ bittorrent.cpp \ searchEngine.cpp \ diff --git a/src/torrentAddition.h b/src/torrentAddition.h index ba0d6d8a1..c259f02d5 100644 --- a/src/torrentAddition.h +++ b/src/torrentAddition.h @@ -179,8 +179,8 @@ public: // set row Color setItemColor(first->index(), "green"); // Add children - QList children = root->getChildren(); - foreach(const torrent_file *child, children) { + QList children = root->getChildren(); + foreach(torrent_file *child, children) { addFilesToTree(child, first); } } From 15427619bd33d9e0c83a26bfbe30f52f69a47657 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 9 Nov 2009 11:49:18 +0000 Subject: [PATCH 30/34] - Forgot to clear some properties data when no torrent is selected --- src/propertiesWidget.ui | 21 +++++++++++++++++++++ src/propertieswidget.cpp | 5 +++++ 2 files changed, 26 insertions(+) diff --git a/src/propertiesWidget.ui b/src/propertiesWidget.ui index 1aaffde69..3f478397d 100644 --- a/src/propertiesWidget.ui +++ b/src/propertiesWidget.ui @@ -806,6 +806,27 @@ QAbstractItemView::ExtendedSelection + + false + + + true + + + false + + + true + + + false + + + true + + + true +
    diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index 82d667ed2..2261b848b 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -160,6 +160,8 @@ void PropertiesWidget::clear() { upTotal->clear(); dlTotal->clear(); shareRatio->clear(); + listWebSeeds->clear(); + PropListModel->clear(); setEnabled(false); } @@ -205,7 +207,10 @@ void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { std::vector files_priority = loadFilesPriorities(); // List files in torrent arborescence *arb = new arborescence(h.get_torrent_info(), fp, files_priority); + PropListModel->clear(); addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem()); + // Increase first column width + //filesList->resizeColumnToContents(0); // does not work } catch(invalid_handle e) { } From d86cb62dc06aa392db93ddbda6fbd74042cd877b Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 9 Nov 2009 11:54:47 +0000 Subject: [PATCH 31/34] - Clearing of fiels list in properties was a bit too efficient (it removed header too) --- src/PropListDelegate.h | 3 +++ src/propertieswidget.cpp | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/PropListDelegate.h b/src/PropListDelegate.h index d77bbb5fe..9a167c7d5 100644 --- a/src/PropListDelegate.h +++ b/src/PropListDelegate.h @@ -113,6 +113,7 @@ class PropListDelegate: public QItemDelegate { } QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex & index) const { + qDebug("CreateEditor called"); if(index.column() != PRIORITY) return 0; QComboBox* editor = new QComboBox(parent); editor->setFocusPolicy(Qt::StrongFocus); @@ -124,6 +125,7 @@ class PropListDelegate: public QItemDelegate { } void setEditorData(QWidget *editor, const QModelIndex &index) const { + qDebug("setEditorData called"); unsigned short val = index.model()->data(index, Qt::DisplayRole).toInt(); QComboBox *combobox = static_cast(editor); qDebug("Set Editor data: Prio is %d", val); @@ -213,6 +215,7 @@ class PropListDelegate: public QItemDelegate { } void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const { + qDebug("UpdateEditor Geometry called"); editor->setGeometry(option.rect); } diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index 2261b848b..cd0534b88 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -161,7 +161,7 @@ void PropertiesWidget::clear() { dlTotal->clear(); shareRatio->clear(); listWebSeeds->clear(); - PropListModel->clear(); + PropListModel->removeRows(0, PropListModel->rowCount()); setEnabled(false); } @@ -207,7 +207,7 @@ void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { std::vector files_priority = loadFilesPriorities(); // List files in torrent arborescence *arb = new arborescence(h.get_torrent_info(), fp, files_priority); - PropListModel->clear(); + PropListModel->removeRows(0, PropListModel->rowCount()); addFilesToTree(arb->getRoot(), PropListModel->invisibleRootItem()); // Increase first column width //filesList->resizeColumnToContents(0); // does not work From f9da85ecfe8a1f223246a1236e99022cf9a46014 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 9 Nov 2009 18:01:54 +0000 Subject: [PATCH 32/34] - Fixed file priorities --- src/PropListDelegate.h | 252 +++++++++++++++++++-------------------- src/propertieswidget.cpp | 32 ++++- src/propertieswidget.h | 1 + 3 files changed, 154 insertions(+), 131 deletions(-) diff --git a/src/PropListDelegate.h b/src/PropListDelegate.h index 9a167c7d5..de20c2eb9 100644 --- a/src/PropListDelegate.h +++ b/src/PropListDelegate.h @@ -49,40 +49,39 @@ enum PropPriority {IGNORED=0, NORMAL=1, HIGH=2, MAXIMUM=7}; class PropListDelegate: public QItemDelegate { Q_OBJECT - signals: - void filteredFilesChanged(); +signals: + void filteredFilesChanged() const; - public: - PropListDelegate(QObject *parent=0) : QItemDelegate(parent){ - } +public: + PropListDelegate(QObject *parent=0) : QItemDelegate(parent){ + } - ~PropListDelegate(){} + ~PropListDelegate(){} - void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ - QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); - QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; - switch(index.column()){ + void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); + switch(index.column()){ case SIZE: - QItemDelegate::drawBackground(painter, opt, index); - QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); - break; + QItemDelegate::drawBackground(painter, opt, index); + QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); + break; case PROGRESS:{ - QStyleOptionProgressBarV2 newopt; - float progress = index.data().toDouble()*100.; - newopt.rect = opt.rect; - newopt.text = QString(QByteArray::number(progress, 'f', 1))+QString::fromUtf8("%"); - newopt.progress = (int)progress; - newopt.maximum = 100; - newopt.minimum = 0; - newopt.state |= QStyle::State_Enabled; - newopt.textVisible = true; - QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); - break; - } + QStyleOptionProgressBarV2 newopt; + float progress = index.data().toDouble()*100.; + newopt.rect = opt.rect; + newopt.text = QString(QByteArray::number(progress, 'f', 1))+QString::fromUtf8("%"); + newopt.progress = (int)progress; + newopt.maximum = 100; + newopt.minimum = 0; + newopt.state |= QStyle::State_Enabled; + newopt.textVisible = true; + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, painter); + break; + } case PRIORITY:{ - QStyleOptionComboBox newopt; - newopt.rect = opt.rect; - switch(index.data().toInt()){ + QStyleOptionComboBox newopt; + newopt.rect = opt.rect; + switch(index.data().toInt()){ case IGNORED: newopt.currentText = tr("Ignored"); break; @@ -98,126 +97,127 @@ class PropListDelegate: public QItemDelegate { default: qDebug("Unhandled priority, setting NORMAL"); newopt.currentText = tr("Normal", "Normal (priority)"); + } + newopt.state |= QStyle::State_Enabled; + newopt.subControls = QStyle::SC_All; + //painter->translate(QPoint(opt.rect.x()*-1,opt.rect.y()*-1)); + //QApplication::style()->drawComplexControl(QStyle::CC_ComboBox, &newopt, painter); + //painter->translate(QPoint(opt.rect.x(),opt.rect.y())); + QApplication::style()->drawControl(QStyle::CE_ComboBoxLabel, &newopt, painter); + break; } - newopt.state |= QStyle::State_Enabled; - QApplication::style()->drawComplexControl(QStyle::CC_ComboBox, &newopt, - painter); - opt.palette.setColor(QPalette::Text, QColor("black")); - painter->setPen(opt.palette.color(cg, QPalette::Text)); - painter->drawText(option.rect, Qt::AlignLeft, QString::fromUtf8(" ")+newopt.currentText); - break; - } default: QItemDelegate::paint(painter, option, index); - } - } + } + } - QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex & index) const { - qDebug("CreateEditor called"); - if(index.column() != PRIORITY) return 0; - QComboBox* editor = new QComboBox(parent); - editor->setFocusPolicy(Qt::StrongFocus); - editor->addItem(tr("Ignored")); - editor->addItem(tr("Normal", "Normal (priority)")); - editor->addItem(tr("High", "High (priority)")); - editor->addItem(tr("Maximum", "Maximum (priority)")); - return editor; - } + QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex & index) const { + qDebug("CreateEditor called"); + if(index.column() != PRIORITY) return 0; + QComboBox* editor = new QComboBox(parent); + editor->setFocusPolicy(Qt::StrongFocus); + editor->addItem(tr("Ignored")); + editor->addItem(tr("Normal", "Normal (priority)")); + editor->addItem(tr("High", "High (priority)")); + editor->addItem(tr("Maximum", "Maximum (priority)")); + return editor; + } - void setEditorData(QWidget *editor, const QModelIndex &index) const { - qDebug("setEditorData called"); - unsigned short val = index.model()->data(index, Qt::DisplayRole).toInt(); - QComboBox *combobox = static_cast(editor); - qDebug("Set Editor data: Prio is %d", val); - switch(val){ + void setEditorData(QWidget *editor, const QModelIndex &index) const { + qDebug("setEditorData called"); + unsigned short val = index.model()->data(index, Qt::DisplayRole).toInt(); + QComboBox *combobox = static_cast(editor); + qDebug("Set Editor data: Prio is %d", val); + switch(val){ case IGNORED: - combobox->setCurrentIndex(0); - break; + combobox->setCurrentIndex(0); + break; case NORMAL: - combobox->setCurrentIndex(1); - break; + combobox->setCurrentIndex(1); + break; case HIGH: - combobox->setCurrentIndex(2); - break; + combobox->setCurrentIndex(2); + break; case MAXIMUM: - combobox->setCurrentIndex(3); - break; + combobox->setCurrentIndex(3); + break; default: - qDebug("Unhandled priority, setting to NORMAL"); - combobox->setCurrentIndex(1); - } + qDebug("Unhandled priority, setting to NORMAL"); + combobox->setCurrentIndex(1); } + } - QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const{ - QVariant value = index.data(Qt::FontRole); - QFont fnt = value.isValid() ? qvariant_cast(value) : option.font; - QFontMetrics fontMetrics(fnt); - const QString text = index.data(Qt::DisplayRole).toString(); - QRect textRect = QRect(0, 0, 0, fontMetrics.lineSpacing() * (text.count(QLatin1Char('\n')) + 1)); - return textRect.size(); - } + QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const{ + QVariant value = index.data(Qt::FontRole); + QFont fnt = value.isValid() ? qvariant_cast(value) : option.font; + QFontMetrics fontMetrics(fnt); + const QString text = index.data(Qt::DisplayRole).toString(); + QRect textRect = QRect(0, 0, 0, fontMetrics.lineSpacing() * (text.count(QLatin1Char('\n')) + 1)); + textRect.setHeight(textRect.height()+10); + return textRect.size(); + } public slots: - void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) { - QComboBox *combobox = static_cast(editor); - int value = combobox->currentIndex(); - qDebug("Setting combobox value in index: %d", value); - unsigned short old_val = index.model()->data(index, Qt::DisplayRole).toInt(); - switch(value){ + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { + QComboBox *combobox = static_cast(editor); + int value = combobox->currentIndex(); + qDebug("Setting combobox value in index: %d", value); + unsigned short old_val = index.model()->data(index, Qt::DisplayRole).toInt(); + switch(value){ case 0: - if(old_val != IGNORED){ - model->setData(index, QVariant(IGNORED)); - emit filteredFilesChanged(); - } else { - // XXX: hack to force the model to send the itemChanged() signal - model->setData(index, QVariant(NORMAL)); - model->setData(index, QVariant(IGNORED)); - } - break; + if(old_val != IGNORED){ + model->setData(index, QVariant(IGNORED)); + emit filteredFilesChanged(); + } else { + // XXX: hack to force the model to send the itemChanged() signal + model->setData(index, QVariant(NORMAL)); + model->setData(index, QVariant(IGNORED)); + } + break; case 1: -// if(old_val != NORMAL){ -// model->setData(index, QVariant(NORMAL)); -// if(filteredFilesChanged != 0) -// *filteredFilesChanged = true; -// } else { - model->setData(index, QVariant(HIGH)); - model->setData(index, QVariant(NORMAL)); - emit filteredFilesChanged(); -// } - break; + // if(old_val != NORMAL){ + // model->setData(index, QVariant(NORMAL)); + // if(filteredFilesChanged != 0) + // *filteredFilesChanged = true; + // } else { + model->setData(index, QVariant(HIGH)); + model->setData(index, QVariant(NORMAL)); + emit filteredFilesChanged(); + // } + break; case 2: - if(old_val != HIGH){ - model->setData(index, QVariant(HIGH)); - emit filteredFilesChanged(); - } else { - model->setData(index, QVariant(NORMAL)); - model->setData(index, QVariant(HIGH)); - } - break; + if(old_val != HIGH){ + model->setData(index, QVariant(HIGH)); + emit filteredFilesChanged(); + } else { + model->setData(index, QVariant(NORMAL)); + model->setData(index, QVariant(HIGH)); + } + break; case 3: - if(old_val != MAXIMUM){ - model->setData(index, QVariant(MAXIMUM)); - emit filteredFilesChanged(); - } else { - model->setData(index, QVariant(HIGH)); - model->setData(index, QVariant(MAXIMUM)); - } - break; + if(old_val != MAXIMUM){ + model->setData(index, QVariant(MAXIMUM)); + emit filteredFilesChanged(); + } else { + model->setData(index, QVariant(HIGH)); + model->setData(index, QVariant(MAXIMUM)); + } + break; default: - if(old_val != NORMAL){ - model->setData(index, QVariant(NORMAL)); - emit filteredFilesChanged(); - } else { - model->setData(index, QVariant(HIGH)); - model->setData(index, QVariant(NORMAL)); - } + if(old_val != NORMAL){ + model->setData(index, QVariant(NORMAL)); + emit filteredFilesChanged(); + } else { + model->setData(index, QVariant(HIGH)); + model->setData(index, QVariant(NORMAL)); } } + } - void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const { - qDebug("UpdateEditor Geometry called"); - editor->setGeometry(option.rect); - } + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const { + qDebug("UpdateEditor Geometry called"); + editor->setGeometry(option.rect); + } }; diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index cd0534b88..5157c1ab0 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -522,7 +522,7 @@ void PropertiesWidget::ignoreSelection(){ if(index.column() == PRIORITY){ if(PropListModel->data(index) != QVariant(IGNORED)){ PropListModel->setData(index, QVariant(IGNORED)); - transferList->updateTorrentSizeAndProgress(h.hash()); + filteredFilesChanged(); setItemColor(index, "red"); } } @@ -535,7 +535,7 @@ void PropertiesWidget::normalSelection(){ if(index.column() == PRIORITY){ if(PropListModel->data(index) != QVariant(NORMAL)){ PropListModel->setData(index, QVariant(NORMAL)); - transferList->updateTorrentSizeAndProgress(h.hash()); + filteredFilesChanged(); setItemColor(index, "green"); } } @@ -548,7 +548,7 @@ void PropertiesWidget::highSelection(){ if(index.column() == PRIORITY){ if(PropListModel->data(index) != QVariant(HIGH)){ PropListModel->setData(index, QVariant(HIGH)); - transferList->updateTorrentSizeAndProgress(h.hash()); + filteredFilesChanged(); setItemColor(index, "green"); } } @@ -561,7 +561,7 @@ void PropertiesWidget::maximumSelection(){ if(index.column() == PRIORITY){ if(PropListModel->data(index) != QVariant(MAXIMUM)){ PropListModel->setData(index, QVariant(MAXIMUM)); - transferList->updateTorrentSizeAndProgress(h.hash()); + filteredFilesChanged(); setItemColor(index, "green"); } } @@ -727,6 +727,26 @@ void PropertiesWidget::setItemColor(QModelIndex index, QString color){ } } +bool PropertiesWidget::savePiecesPriorities() { + /*if(!changedFilteredfiles) return true; + if(allFiltered()) { + QMessageBox::warning(0, tr("Priorities error"), tr("Error, you can't filter all the files in a torrent.")); + return false; + }*/ + qDebug("Saving pieces priorities"); + int *priorities = new int[h.get_torrent_info().num_files()]; + getPriorities(PropListModel->invisibleRootItem(), priorities); + unsigned int nbFiles = h.get_torrent_info().num_files(); + for(unsigned int i=0; iupdateTorrentSizeAndProgress(h.hash()); + } } void PropertiesWidget::addFilesToTree(torrent_file *root, QStandardItem *parent) { diff --git a/src/propertieswidget.h b/src/propertieswidget.h index 6c563c2a1..549b9ff01 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -75,6 +75,7 @@ protected: QPushButton* getButtonFromIndex(int index); std::vector loadFilesPriorities(); bool allFiltered() const; + bool savePiecesPriorities(); protected slots: void loadTorrentInfos(QTorrentHandle &h); From 998b161696ce8bb5d47482b683ff1051727aaaaf Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 9 Nov 2009 19:30:13 +0000 Subject: [PATCH 33/34] - Save files list column width --- src/GUI.cpp | 1 + src/propertiesWidget.ui | 28 ++++++++++++++++++++-------- src/propertieswidget.cpp | 25 +++++++++++++++++++++++-- src/propertieswidget.h | 2 ++ 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/GUI.cpp b/src/GUI.cpp index c48deb4f3..4ce60dc65 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -247,6 +247,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), dis // Load Window state and sizes readSettings(); + properties->readSettings(); if(settings.value(QString::fromUtf8("Preferences/General/StartMinimized"), false).toBool()) { this->setWindowState(Qt::WindowMinimized); diff --git a/src/propertiesWidget.ui b/src/propertiesWidget.ui index 3f478397d..fcaf9c771 100644 --- a/src/propertiesWidget.ui +++ b/src/propertiesWidget.ui @@ -7,7 +7,7 @@ 0 0 756 - 333 + 303 @@ -19,13 +19,22 @@ 16777215 - 333 + 303 Form + + + + + 0 + + + 0 + @@ -821,12 +830,6 @@ false - - true - - - true - @@ -886,6 +889,15 @@ + + 5 + + + 4 + + + 5 + diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index 5157c1ab0..d2638fe0c 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -116,8 +116,7 @@ PropertiesWidget::PropertiesWidget(QWidget *parent, TransferListWidget *transfer } PropertiesWidget::~PropertiesWidget() { - QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); - settings.setValue("TorrentProperties/Visible", state==VISIBLE); + saveSettings(); delete refreshTimer; if(progressBarUpdater) delete progressBarUpdater; @@ -218,6 +217,28 @@ void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { loadDynamicData(); } +void PropertiesWidget::readSettings() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + QVariantList contentColsWidths = settings.value(QString::fromUtf8("TorrentProperties/filesColsWidth"), QVariantList()).toList(); + if(contentColsWidths.empty()) { + filesList->header()->resizeSection(0, filesList->width()/2.); + } else { + for(int i=0; isetColumnWidth(i, contentColsWidths.at(i).toInt()); + } + } +} + +void PropertiesWidget::saveSettings() { + QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent")); + settings.setValue("TorrentProperties/Visible", state==VISIBLE); + QVariantList contentColsWidths; + for(int i=0; icolumnCount()-1; ++i) { + contentColsWidths.append(filesList->columnWidth(i)); + } + settings.setValue(QString::fromUtf8("TorrentProperties/filesColsWidth"), contentColsWidths); +} + void PropertiesWidget::loadDynamicData() { if(!h.is_valid()) return; try { diff --git a/src/propertieswidget.h b/src/propertieswidget.h index 549b9ff01..adb44dde1 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -112,6 +112,8 @@ public slots: void reduce(); void slide(); void clear(); + void readSettings(); + void saveSettings(); public: PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession); From 611e33bf80673e19d225e4efe8c7ebf00d444346 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Mon, 9 Nov 2009 20:04:17 +0000 Subject: [PATCH 34/34] - Polish torrent properties --- src/PropListDelegate.h | 10 ++++++---- src/propertiesWidget.ui | 38 +++++++++++++++++++++++++++++++++----- src/propertieswidget.cpp | 6 +++--- src/realprogressbar.cpp | 1 + 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/PropListDelegate.h b/src/PropListDelegate.h index de20c2eb9..1def6ce28 100644 --- a/src/PropListDelegate.h +++ b/src/PropListDelegate.h @@ -98,12 +98,14 @@ public: qDebug("Unhandled priority, setting NORMAL"); newopt.currentText = tr("Normal", "Normal (priority)"); } - newopt.state |= QStyle::State_Enabled; - newopt.subControls = QStyle::SC_All; + //newopt.state |= QStyle::State_Enabled; + //newopt.subControls = QStyle::SC_All; //painter->translate(QPoint(opt.rect.x()*-1,opt.rect.y()*-1)); //QApplication::style()->drawComplexControl(QStyle::CC_ComboBox, &newopt, painter); //painter->translate(QPoint(opt.rect.x(),opt.rect.y())); - QApplication::style()->drawControl(QStyle::CE_ComboBoxLabel, &newopt, painter); + //QApplication::style()->drawControl(QStyle::CE_ComboBoxLabel, &newopt, painter); + QItemDelegate::drawBackground(painter, opt, index); + QItemDelegate::drawDisplay(painter, opt, option.rect, newopt.currentText); break; } default: @@ -153,7 +155,7 @@ public: QFontMetrics fontMetrics(fnt); const QString text = index.data(Qt::DisplayRole).toString(); QRect textRect = QRect(0, 0, 0, fontMetrics.lineSpacing() * (text.count(QLatin1Char('\n')) + 1)); - textRect.setHeight(textRect.height()+10); + textRect.setHeight(textRect.height()+4); return textRect.size(); } diff --git a/src/propertiesWidget.ui b/src/propertiesWidget.ui index fcaf9c771..77f293cae 100644 --- a/src/propertiesWidget.ui +++ b/src/propertiesWidget.ui @@ -7,11 +7,11 @@ 0 0 756 - 303 + 291 - + 0 0 @@ -37,6 +37,18 @@ + + + 0 + 0 + + + + + 16777215 + 260 + + 0 @@ -44,6 +56,9 @@ + + 0 + @@ -57,6 +72,9 @@ Torrent information + + 0 + @@ -259,12 +277,18 @@ Current session - - 6 + + 9 - + 9 + + 9 + + + 0 + @@ -905,6 +929,7 @@ border: 1px solid rgb(85, 81, 91); border-radius: 3px; padding: 2px; +margin-left: 3px; margin-right: 3px; } @@ -929,6 +954,7 @@ padding: 2px; border: 1px solid rgb(85, 81, 91); border-radius: 3px; padding: 2px; +margin-left: 3px; margin-right: 3px; } @@ -953,6 +979,7 @@ padding: 2px; border: 1px solid rgb(85, 81, 91); border-radius: 3px; padding: 2px; +margin-left: 3px; margin-right: 3px; } @@ -977,6 +1004,7 @@ padding: 2px; border: 1px solid rgb(85, 81, 91); border-radius: 3px; padding: 2px; +margin-left: 3px; margin-right: 3px; } diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index d2638fe0c..7e4849f01 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -50,8 +50,8 @@ #include "PropListDelegate.h" #include "TrackersAdditionDlg.h" -#define DEFAULT_BUTTON_CSS "QPushButton {border: 1px solid rgb(85, 81, 91);border-radius: 3px;padding: 2px;}" -#define SELECTED_BUTTON_CSS "QPushButton {border: 1px solid rgb(85, 81, 91);border-radius: 3px;padding: 2px;background-color: rgb(255, 208, 105);}" +#define DEFAULT_BUTTON_CSS "QPushButton {border: 1px solid rgb(85, 81, 91);border-radius: 3px;padding: 2px; margin-left: 3px; margin-right: 3px;}" +#define SELECTED_BUTTON_CSS "QPushButton {border: 1px solid rgb(85, 81, 91);border-radius: 3px;padding: 2px;background-color: rgb(255, 208, 105);margin-left: 3px; margin-right: 3px;}" PropertiesWidget::PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession): QWidget(parent), transferList(transferList), BTSession(BTSession) { setupUi(this); @@ -141,7 +141,7 @@ void PropertiesWidget::reduce() { void PropertiesWidget::slide() { if(state == REDUCED) { - stackedProperties->setFixedHeight(232); + stackedProperties->setFixedHeight(260); state = VISIBLE; } } diff --git a/src/realprogressbar.cpp b/src/realprogressbar.cpp index 667f3c89b..8ae80c0ec 100644 --- a/src/realprogressbar.cpp +++ b/src/realprogressbar.cpp @@ -38,6 +38,7 @@ RealProgressBar::RealProgressBar(QWidget *parent) { background = Qt::white; foreground = Qt::black; + setFixedHeight(20); active = false; array[0] = 0.; drawPixmap();