You've already forked qBittorrent
mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-11-09 10:02:39 +01:00
Compare commits
75 Commits
release-2.
...
release-2.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9018bdfad0 | ||
|
|
1962898e24 | ||
|
|
56b88661bc | ||
|
|
5b47a762ac | ||
|
|
a5c6bcceea | ||
|
|
290932e128 | ||
|
|
f53fe96191 | ||
|
|
fc8a822dac | ||
|
|
b7a3ae2b4c | ||
|
|
26d19b33e6 | ||
|
|
4ba9dc1fed | ||
|
|
2c3f99692d | ||
|
|
a27d2dcac2 | ||
|
|
f7cb6a7da5 | ||
|
|
6855edf649 | ||
|
|
aff27558dd | ||
|
|
f6172f8c77 | ||
|
|
1562088bc8 | ||
|
|
67973515d5 | ||
|
|
7867cf68f9 | ||
|
|
1eb26bd78b | ||
|
|
a8d635f7ac | ||
|
|
289ad37f06 | ||
|
|
94de42bf2e | ||
|
|
ca9f40eb7f | ||
|
|
4013f9fefd | ||
|
|
ccf0002c0f | ||
|
|
86fb4a323a | ||
|
|
38c56a2b5f | ||
|
|
2d1286158a | ||
|
|
6e7309316c | ||
|
|
593fdad426 | ||
|
|
933a831eb1 | ||
|
|
7c55082464 | ||
|
|
fa3e70316e | ||
|
|
c9c2ab320d | ||
|
|
53d9817d8a | ||
|
|
828ecb6b3c | ||
|
|
af61ed7c72 | ||
|
|
1e86ea8c0a | ||
|
|
129bfac549 | ||
|
|
4815bb9f11 | ||
|
|
81eb8b1341 | ||
|
|
1596dc5206 | ||
|
|
76a22fabcd | ||
|
|
3d7bf26f85 | ||
|
|
69661406a0 | ||
|
|
74fba0fb7e | ||
|
|
d56fc9fcd4 | ||
|
|
124dcee7b8 | ||
|
|
b5b06ce36d | ||
|
|
ef01088411 | ||
|
|
bc87c1c409 | ||
|
|
bbe4328c06 | ||
|
|
d557410156 | ||
|
|
a150e24ce4 | ||
|
|
261d02863c | ||
|
|
c64f02c9bf | ||
|
|
790db14b51 | ||
|
|
2500ac2cb7 | ||
|
|
cd8a7cf0e0 | ||
|
|
b3be32126d | ||
|
|
643bc5516c | ||
|
|
eb94c59892 | ||
|
|
72f4c81f4c | ||
|
|
9543bd63f9 | ||
|
|
7ae7a71782 | ||
|
|
8994ca6dd5 | ||
|
|
354dceeaf0 | ||
|
|
50c7225c1e | ||
|
|
44d945b5c0 | ||
|
|
4ff6104601 | ||
|
|
80760dd7af | ||
|
|
7835a13573 | ||
|
|
9b26fd50b2 |
48
Changelog
48
Changelog
@@ -1,46 +1,8 @@
|
|||||||
* Sun Oct 17 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.6
|
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.5.0
|
||||||
- BUGFIX: Fix "torrent seeding after creation" feature
|
- FEATURE: qBittorrent can now act as a tracker
|
||||||
- BUGFIX: The properties panel data would sometimes not match the selected torrent
|
- FEATURE: Added feature to shutdown qbittorrent on torrents completion
|
||||||
- BUGFIX: Fix detection of files at final destination when temp dir is used
|
- FEATURE: Added a transfer list column to display the current tracker
|
||||||
- BUGFIX: Fix moving of a torrent to an unexisting directory
|
- COSMETIC: Replaced message box by on-screen notification for download errors
|
||||||
|
|
||||||
* Tue Oct 12 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.5
|
|
||||||
- BUGFIX: Remember torrent completion date correctly
|
|
||||||
- BUGFIX: Fix feature to keep incomplete torrents in a separate folder
|
|
||||||
- BUGFIX: Fix display of URL seeds in the UI
|
|
||||||
- BUGFIX: Improved peer hostname resolution with caching
|
|
||||||
- BUGFIX: Piece availability/downloaded widgets performance improvement
|
|
||||||
|
|
||||||
* Fri Oct 1 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.4
|
|
||||||
- BUGFIX: Clean program exit on system shutdown/logout
|
|
||||||
- BUGFIX: Fix possible search engine plugin update
|
|
||||||
|
|
||||||
* Tue Sep 28 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.3
|
|
||||||
- BUGFIX: Fix encoding issue in command line parameters processing
|
|
||||||
- BUGFIX: Fix possible crash when changing the save path in addition dialog
|
|
||||||
- BUGFIX: Fix wrong mapping to source model
|
|
||||||
|
|
||||||
* Sun Sep 26 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.2
|
|
||||||
- BUGFIX: Fix display of torrent content in addition dialog
|
|
||||||
- BUGFIX: Really fix manual editing of save path in torrent addition dialog
|
|
||||||
|
|
||||||
* Sun Sep 26 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.1
|
|
||||||
- I18N: Updated Arabic translation
|
|
||||||
- I18N: Fixes to German translation
|
|
||||||
- BUGFIX: Save path can now be edited in torrent addition dialog
|
|
||||||
- BUGFIX: Fix save path encoding on non-utf8 systems
|
|
||||||
- BUGFIX: Fix saving to drive root on Windows
|
|
||||||
- BUGFIX: OGV can now be previewed
|
|
||||||
- BUGFIX: Maximum download limit is now 10MB/s
|
|
||||||
- BUGFIX: Fix 'download in scan dir' persistence
|
|
||||||
- BUGFIX: Add .torrent extension only when missing (torrent creator)
|
|
||||||
- BUGFIX: Fix possible issue with temporary download path persistence
|
|
||||||
- BUGFIX: Added support for | (OR) operator in RSS feed downloader
|
|
||||||
- BUGFIX: Fix Web UI for spanish users
|
|
||||||
- BUGFIX: Fix locale switching from Web UI
|
|
||||||
- BUGFIX: Use AND operator for torrentdownloads.net searches
|
|
||||||
- BUGFIX: Limit torrent addition dialog width to fit the screen
|
|
||||||
- COSMETIC: Fix progress bars style on Windows
|
|
||||||
|
|
||||||
* Tue Aug 24 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.0
|
* Tue Aug 24 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.0
|
||||||
- FEATURE: Added actions to "Move to top/bottom" of priority queue
|
- FEATURE: Added actions to "Move to top/bottom" of priority queue
|
||||||
|
|||||||
2
INSTALL
2
INSTALL
@@ -10,7 +10,7 @@ qBittorrent - A BitTorrent client in C++ / Qt4
|
|||||||
will install and execute qBittorrent hopefully without any problems.
|
will install and execute qBittorrent hopefully without any problems.
|
||||||
|
|
||||||
Dependencies:
|
Dependencies:
|
||||||
- Qt >= 4.4.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
- Qt >= 4.5.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
||||||
|
|
||||||
- pkg-config executable
|
- pkg-config executable
|
||||||
|
|
||||||
|
|||||||
26
configure
vendored
26
configure
vendored
@@ -325,7 +325,7 @@ cat >$1/modules.cpp <<EOT
|
|||||||
#line 1 "qt4.qcm"
|
#line 1 "qt4.qcm"
|
||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: Qt >= 4.4
|
name: Qt >= 4.5
|
||||||
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
@@ -333,14 +333,14 @@ class qc_qt4 : public ConfObj
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_qt4(Conf *c) : ConfObj(c) {}
|
qc_qt4(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "Qt >= 4.4"; }
|
QString name() const { return "Qt >= 4.5"; }
|
||||||
QString shortname() const { return "Qt 4.4"; }
|
QString shortname() const { return "Qt 4.5"; }
|
||||||
bool exec()
|
bool exec()
|
||||||
{
|
{
|
||||||
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||||
conf->addDefine("DISABLE_GUI");
|
conf->addDefine("DISABLE_GUI");
|
||||||
}
|
}
|
||||||
return(QT_VERSION >= 0x040400);
|
return(QT_VERSION >= 0x040500);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#line 1 "pkg-config.qcm"
|
#line 1 "pkg-config.qcm"
|
||||||
@@ -616,22 +616,22 @@ arg: with-qtsingleapplication=[system|shipped], Use the shipped qtsingleapplicat
|
|||||||
class qc_qtsingleapplication : public ConfObj
|
class qc_qtsingleapplication : public ConfObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_qtsingleapplication(Conf *c) : ConfObj(c) {}
|
qc_qtsingleapplication(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "qtsingleapplication library"; }
|
QString name() const { return "qtsingleapplication library"; }
|
||||||
QString shortname() const { return "qtsingleapplication"; }
|
QString shortname() const { return "qtsingleapplication"; }
|
||||||
|
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QString s;
|
QString s;
|
||||||
s = conf->getenv("QC_WITH_QTSINGLEAPPLICATION");
|
s = conf->getenv("QC_WITH_QTSINGLEAPPLICATION");
|
||||||
if(s.compare("system", Qt::CaseInsensitive) == 0) {
|
if(s.compare("system", Qt::CaseInsensitive) == 0) {
|
||||||
// System
|
// System
|
||||||
conf->addDefine("USE_SYSTEM_QTSINGLEAPPLICATION");
|
conf->addDefine("USE_SYSTEM_QTSINGLEAPPLICATION");
|
||||||
printf(" [system] ");
|
printf(" [system] ");
|
||||||
} else {
|
} else {
|
||||||
printf(" [shipped] ");
|
printf(" [shipped] ");
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: Qt >= 4.4
|
name: Qt >= 4.5
|
||||||
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
@@ -8,13 +8,13 @@ class qc_qt4 : public ConfObj
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_qt4(Conf *c) : ConfObj(c) {}
|
qc_qt4(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "Qt >= 4.4"; }
|
QString name() const { return "Qt >= 4.5"; }
|
||||||
QString shortname() const { return "Qt 4.4"; }
|
QString shortname() const { return "Qt 4.5"; }
|
||||||
bool exec()
|
bool exec()
|
||||||
{
|
{
|
||||||
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
||||||
conf->addDefine("DISABLE_GUI");
|
conf->addDefine("DISABLE_GUI");
|
||||||
}
|
}
|
||||||
return(QT_VERSION >= 0x040400);
|
return(QT_VERSION >= 0x040500);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
22
src/GUI.cpp
22
src/GUI.cpp
@@ -52,7 +52,7 @@
|
|||||||
#include "torrentadditiondlg.h"
|
#include "torrentadditiondlg.h"
|
||||||
#include "searchengine.h"
|
#include "searchengine.h"
|
||||||
#include "rss_imp.h"
|
#include "rss_imp.h"
|
||||||
#include "bittorrent.h"
|
#include "qbtsession.h"
|
||||||
#include "about_imp.h"
|
#include "about_imp.h"
|
||||||
#include "trackerlogin.h"
|
#include "trackerlogin.h"
|
||||||
#include "options_imp.h"
|
#include "options_imp.h"
|
||||||
@@ -126,7 +126,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), for
|
|||||||
// Fix Tool bar layout
|
// Fix Tool bar layout
|
||||||
toolBar->layout()->setSpacing(7);
|
toolBar->layout()->setSpacing(7);
|
||||||
// Creating Bittorrent session
|
// Creating Bittorrent session
|
||||||
BTSession = new Bittorrent();
|
BTSession = new QBtSession();
|
||||||
connect(BTSession, SIGNAL(fullDiskError(QTorrentHandle&, QString)), this, SLOT(fullDiskError(QTorrentHandle&, QString)));
|
connect(BTSession, SIGNAL(fullDiskError(QTorrentHandle&, QString)), this, SLOT(fullDiskError(QTorrentHandle&, QString)));
|
||||||
connect(BTSession, SIGNAL(finishedTorrent(QTorrentHandle&)), this, SLOT(finishedTorrent(QTorrentHandle&)));
|
connect(BTSession, SIGNAL(finishedTorrent(QTorrentHandle&)), this, SLOT(finishedTorrent(QTorrentHandle&)));
|
||||||
connect(BTSession, SIGNAL(trackerAuthenticationRequired(QTorrentHandle&)), this, SLOT(trackerAuthenticationRequired(QTorrentHandle&)));
|
connect(BTSession, SIGNAL(trackerAuthenticationRequired(QTorrentHandle&)), this, SLOT(trackerAuthenticationRequired(QTorrentHandle&)));
|
||||||
@@ -202,6 +202,7 @@ GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), for
|
|||||||
displaySearchTab(actionSearch_engine->isChecked());
|
displaySearchTab(actionSearch_engine->isChecked());
|
||||||
displayRSSTab(actionRSS_Reader->isChecked());
|
displayRSSTab(actionRSS_Reader->isChecked());
|
||||||
actionShutdown_when_downloads_complete->setChecked(Preferences::shutdownWhenDownloadsComplete());
|
actionShutdown_when_downloads_complete->setChecked(Preferences::shutdownWhenDownloadsComplete());
|
||||||
|
actionShutdown_qBittorrent_when_downloads_complete->setChecked(Preferences::shutdownqBTWhenDownloadsComplete());
|
||||||
|
|
||||||
show();
|
show();
|
||||||
|
|
||||||
@@ -541,7 +542,7 @@ void GUI::askRecursiveTorrentDownloadConfirmation(QTorrentHandle &h) {
|
|||||||
|
|
||||||
void GUI::handleDownloadFromUrlFailure(QString url, QString reason) const{
|
void GUI::handleDownloadFromUrlFailure(QString url, QString reason) const{
|
||||||
// Display a message box
|
// 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));
|
showNotificationBaloon(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() {
|
void GUI::on_actionSet_global_upload_limit_triggered() {
|
||||||
@@ -921,7 +922,6 @@ void GUI::optionsSaved() {
|
|||||||
// Load program preferences
|
// Load program preferences
|
||||||
void GUI::loadPreferences(bool configure_session) {
|
void GUI::loadPreferences(bool configure_session) {
|
||||||
BTSession->addConsoleMessage(tr("Options were saved successfully."));
|
BTSession->addConsoleMessage(tr("Options were saved successfully."));
|
||||||
#ifndef Q_WS_MAC
|
|
||||||
const bool newSystrayIntegration = Preferences::systrayIntegration();
|
const bool newSystrayIntegration = Preferences::systrayIntegration();
|
||||||
actionLock_qBittorrent->setEnabled(newSystrayIntegration);
|
actionLock_qBittorrent->setEnabled(newSystrayIntegration);
|
||||||
if(newSystrayIntegration != (systrayIcon!=0)) {
|
if(newSystrayIntegration != (systrayIcon!=0)) {
|
||||||
@@ -946,7 +946,6 @@ void GUI::loadPreferences(bool configure_session) {
|
|||||||
delete myTrayIconMenu;
|
delete myTrayIconMenu;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
// General
|
// General
|
||||||
if(Preferences::isToolbarDisplayed()) {
|
if(Preferences::isToolbarDisplayed()) {
|
||||||
toolBar->setVisible(true);
|
toolBar->setVisible(true);
|
||||||
@@ -1010,9 +1009,8 @@ void GUI::trackerAuthenticationRequired(QTorrentHandle& h) {
|
|||||||
// Check connection status and display right icon
|
// Check connection status and display right icon
|
||||||
void GUI::updateGUI() {
|
void GUI::updateGUI() {
|
||||||
// update global informations
|
// update global informations
|
||||||
#ifndef Q_WS_MAC
|
|
||||||
if(systrayIcon) {
|
if(systrayIcon) {
|
||||||
#if defined(Q_WS_X11)
|
#if defined(Q_WS_X11) || defined(Q_WS_MAC)
|
||||||
QString html = "<div style='background-color: #678db2; color: #fff;height: 18px; font-weight: bold; margin-bottom: 5px;'>";
|
QString html = "<div style='background-color: #678db2; color: #fff;height: 18px; font-weight: bold; margin-bottom: 5px;'>";
|
||||||
html += tr("qBittorrent");
|
html += tr("qBittorrent");
|
||||||
html += "</div>";
|
html += "</div>";
|
||||||
@@ -1030,7 +1028,6 @@ void GUI::updateGUI() {
|
|||||||
#endif
|
#endif
|
||||||
systrayIcon->setToolTip(html); // tray icon
|
systrayIcon->setToolTip(html); // tray icon
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if(displaySpeedInTitle) {
|
if(displaySpeedInTitle) {
|
||||||
setWindowTitle(tr("qBittorrent %1 (Down: %2/s, Up: %3/s)", "%1 is qBittorrent version").arg(QString::fromUtf8(VERSION)).arg(misc::friendlyUnit(BTSession->getSessionStatus().payload_download_rate)).arg(misc::friendlyUnit(BTSession->getSessionStatus().payload_upload_rate)));
|
setWindowTitle(tr("qBittorrent %1 (Down: %2/s, Up: %3/s)", "%1 is qBittorrent version").arg(QString::fromUtf8(VERSION)).arg(misc::friendlyUnit(BTSession->getSessionStatus().payload_download_rate)).arg(misc::friendlyUnit(BTSession->getSessionStatus().payload_upload_rate)));
|
||||||
}
|
}
|
||||||
@@ -1050,10 +1047,8 @@ void GUI::showNotificationBaloon(QString title, QString msg) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifndef Q_WS_MAC
|
|
||||||
if(systrayIcon && QSystemTrayIcon::supportsMessages())
|
if(systrayIcon && QSystemTrayIcon::supportsMessages())
|
||||||
systrayIcon->showMessage(title, msg, QSystemTrayIcon::Information, TIME_TRAY_BALLOON);
|
systrayIcon->showMessage(title, msg, QSystemTrayIcon::Information, TIME_TRAY_BALLOON);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************
|
/*****************************************************
|
||||||
@@ -1090,7 +1085,6 @@ void GUI::downloadFromURLList(const QStringList& url_list) {
|
|||||||
*****************************************************/
|
*****************************************************/
|
||||||
|
|
||||||
void GUI::createSystrayDelayed() {
|
void GUI::createSystrayDelayed() {
|
||||||
#ifndef Q_WS_MAC
|
|
||||||
static int timeout = 20;
|
static int timeout = 20;
|
||||||
if(QSystemTrayIcon::isSystemTrayAvailable()) {
|
if(QSystemTrayIcon::isSystemTrayAvailable()) {
|
||||||
// Ok, systray integration is now supported
|
// Ok, systray integration is now supported
|
||||||
@@ -1111,7 +1105,6 @@ void GUI::createSystrayDelayed() {
|
|||||||
Preferences::setSystrayIntegration(false);
|
Preferences::setSystrayIntegration(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GUI::updateAltSpeedsBtn(bool alternative) {
|
void GUI::updateAltSpeedsBtn(bool alternative) {
|
||||||
@@ -1178,6 +1171,11 @@ void GUI::on_actionShutdown_when_downloads_complete_triggered() {
|
|||||||
Preferences::setShutdownWhenDownloadsComplete(is_checked);
|
Preferences::setShutdownWhenDownloadsComplete(is_checked);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GUI::on_actionShutdown_qBittorrent_when_downloads_complete_triggered() {
|
||||||
|
bool is_checked = static_cast<QAction*>(sender())->isChecked();
|
||||||
|
Preferences::setShutdownqBTWhenDownloadsComplete(is_checked);
|
||||||
|
}
|
||||||
|
|
||||||
void GUI::on_actionSpeed_in_title_bar_triggered() {
|
void GUI::on_actionSpeed_in_title_bar_triggered() {
|
||||||
displaySpeedInTitle = static_cast<QAction*>(sender())->isChecked();
|
displaySpeedInTitle = static_cast<QAction*>(sender())->isChecked();
|
||||||
Preferences::showSpeedInTitleBar(displaySpeedInTitle);
|
Preferences::showSpeedInTitleBar(displaySpeedInTitle);
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
#include "ui_mainwindow.h"
|
#include "ui_mainwindow.h"
|
||||||
#include "qtorrenthandle.h"
|
#include "qtorrenthandle.h"
|
||||||
|
|
||||||
class Bittorrent;
|
class QBtSession;
|
||||||
class QTimer;
|
class QTimer;
|
||||||
class downloadFromURL;
|
class downloadFromURL;
|
||||||
class SearchEngine;
|
class SearchEngine;
|
||||||
@@ -140,7 +140,7 @@ protected:
|
|||||||
private:
|
private:
|
||||||
QFileSystemWatcher *executable_watcher;
|
QFileSystemWatcher *executable_watcher;
|
||||||
// Bittorrent
|
// Bittorrent
|
||||||
Bittorrent *BTSession;
|
QBtSession *BTSession;
|
||||||
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers; // Still needed?
|
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers; // Still needed?
|
||||||
// GUI related
|
// GUI related
|
||||||
QTimer *guiUpdater;
|
QTimer *guiUpdater;
|
||||||
@@ -183,6 +183,7 @@ private slots:
|
|||||||
void on_actionSpeed_in_title_bar_triggered();
|
void on_actionSpeed_in_title_bar_triggered();
|
||||||
void on_actionTop_tool_bar_triggered();
|
void on_actionTop_tool_bar_triggered();
|
||||||
void on_actionShutdown_when_downloads_complete_triggered();
|
void on_actionShutdown_when_downloads_complete_triggered();
|
||||||
|
void on_actionShutdown_qBittorrent_when_downloads_complete_triggered();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Categories=Qt;Network;P2P;
|
Categories=Qt;Network;P2P;
|
||||||
Comment=V2.4.6
|
Comment=V2.5.0
|
||||||
Exec=qbittorrent %f
|
Exec=qbittorrent %f
|
||||||
GenericName=Bittorrent client
|
GenericName=Bittorrent client
|
||||||
GenericName[ar]=العميل Bittorrent
|
GenericName[ar]=العميل Bittorrent
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
@@ -47,7 +47,7 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleGetInfoString</key>
|
<key>CFBundleGetInfoString</key>
|
||||||
<string>2.4.6</string>
|
<string>2.5.0</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
|
|||||||
@@ -11,15 +11,15 @@
|
|||||||
#include "preferences.h"
|
#include "preferences.h"
|
||||||
|
|
||||||
enum AdvSettingsCols {PROPERTY, VALUE};
|
enum AdvSettingsCols {PROPERTY, VALUE};
|
||||||
enum AdvSettingsRows {DISK_CACHE, OUTGOING_PORT_MIN, OUTGOING_PORT_MAX, IGNORE_LIMIT_LAN, COUNT_OVERHEAD, RECHECK_COMPLETED, LIST_REFRESH, RESOLVE_COUNTRIES, RESOLVE_HOSTS, MAX_HALF_OPEN, SUPER_SEEDING, NETWORK_IFACE, PROGRAM_NOTIFICATIONS };
|
enum AdvSettingsRows {DISK_CACHE, OUTGOING_PORT_MIN, OUTGOING_PORT_MAX, IGNORE_LIMIT_LAN, COUNT_OVERHEAD, RECHECK_COMPLETED, LIST_REFRESH, RESOLVE_COUNTRIES, RESOLVE_HOSTS, MAX_HALF_OPEN, SUPER_SEEDING, NETWORK_IFACE, PROGRAM_NOTIFICATIONS, TRACKER_STATUS, TRACKER_PORT };
|
||||||
#define ROW_COUNT 13
|
#define ROW_COUNT 15
|
||||||
|
|
||||||
class AdvancedSettings: public QTableWidget {
|
class AdvancedSettings: public QTableWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QSpinBox *spin_cache, *outgoing_ports_min, *outgoing_ports_max, *spin_list_refresh, *spin_maxhalfopen;
|
QSpinBox *spin_cache, *outgoing_ports_min, *outgoing_ports_max, *spin_list_refresh, *spin_maxhalfopen, *spin_tracker_port;
|
||||||
QCheckBox *cb_ignore_limits_lan, *cb_count_overhead, *cb_recheck_completed, *cb_resolve_countries, *cb_resolve_hosts, *cb_super_seeding, *cb_program_notifications;
|
QCheckBox *cb_ignore_limits_lan, *cb_count_overhead, *cb_recheck_completed, *cb_resolve_countries, *cb_resolve_hosts, *cb_super_seeding, *cb_program_notifications, *cb_tracker_status;
|
||||||
QComboBox *combo_iface;
|
QComboBox *combo_iface;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -53,6 +53,8 @@ public:
|
|||||||
delete cb_super_seeding;
|
delete cb_super_seeding;
|
||||||
delete combo_iface;
|
delete combo_iface;
|
||||||
delete cb_program_notifications;
|
delete cb_program_notifications;
|
||||||
|
delete spin_tracker_port;
|
||||||
|
delete cb_tracker_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
@@ -88,6 +90,9 @@ public slots:
|
|||||||
}
|
}
|
||||||
// Program notification
|
// Program notification
|
||||||
Preferences::useProgramNotification(cb_program_notifications->isChecked());
|
Preferences::useProgramNotification(cb_program_notifications->isChecked());
|
||||||
|
// Tracker
|
||||||
|
Preferences::setTrackerEnabled(cb_tracker_status->isChecked());
|
||||||
|
Preferences::setTrackerPort(spin_tracker_port->value());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
@@ -190,11 +195,25 @@ protected slots:
|
|||||||
connect(combo_iface, SIGNAL(currentIndexChanged(int)), this, SLOT(emitSettingsChanged()));
|
connect(combo_iface, SIGNAL(currentIndexChanged(int)), this, SLOT(emitSettingsChanged()));
|
||||||
setCellWidget(NETWORK_IFACE, VALUE, combo_iface);
|
setCellWidget(NETWORK_IFACE, VALUE, combo_iface);
|
||||||
// Program notifications
|
// Program notifications
|
||||||
setItem(PROGRAM_NOTIFICATIONS, PROPERTY, new QTableWidgetItem(tr("Display program notification baloons")));
|
setItem(PROGRAM_NOTIFICATIONS, PROPERTY, new QTableWidgetItem(tr("Display program notification balloons")));
|
||||||
cb_program_notifications = new QCheckBox();
|
cb_program_notifications = new QCheckBox();
|
||||||
connect(cb_program_notifications, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged()));
|
connect(cb_program_notifications, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged()));
|
||||||
cb_program_notifications->setChecked(Preferences::useProgramNotification());
|
cb_program_notifications->setChecked(Preferences::useProgramNotification());
|
||||||
setCellWidget(PROGRAM_NOTIFICATIONS, VALUE, cb_program_notifications);
|
setCellWidget(PROGRAM_NOTIFICATIONS, VALUE, cb_program_notifications);
|
||||||
|
// Tracker State
|
||||||
|
setItem(TRACKER_STATUS, PROPERTY, new QTableWidgetItem(tr("Enable embedded tracker")));
|
||||||
|
cb_tracker_status = new QCheckBox();
|
||||||
|
connect(cb_tracker_status, SIGNAL(toggled(bool)), this, SLOT(emitSettingsChanged()));
|
||||||
|
cb_tracker_status->setChecked(Preferences::isTrackerEnabled());
|
||||||
|
setCellWidget(TRACKER_STATUS, VALUE, cb_tracker_status);
|
||||||
|
// Tracker port
|
||||||
|
setItem(TRACKER_PORT, PROPERTY, new QTableWidgetItem(tr("Embedded tracker port")));
|
||||||
|
spin_tracker_port = new QSpinBox();
|
||||||
|
connect(spin_tracker_port, SIGNAL(valueChanged(int)), this, SLOT(emitSettingsChanged()));
|
||||||
|
spin_tracker_port->setMinimum(1);
|
||||||
|
spin_tracker_port->setMaximum(65535);
|
||||||
|
spin_tracker_port->setValue(Preferences::getTrackerPort());
|
||||||
|
setCellWidget(TRACKER_PORT, VALUE, spin_tracker_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
void emitSettingsChanged() {
|
void emitSettingsChanged() {
|
||||||
|
|||||||
2657
src/bittorrent.cpp
2657
src/bittorrent.cpp
File diff suppressed because it is too large
Load Diff
@@ -31,7 +31,7 @@
|
|||||||
#ifndef CONSOLE_H
|
#ifndef CONSOLE_H
|
||||||
#define CONSOLE_H
|
#define CONSOLE_H
|
||||||
|
|
||||||
#include "bittorrent.h"
|
#include "qbtsession.h"
|
||||||
#include "ui_console.h"
|
#include "ui_console.h"
|
||||||
|
|
||||||
using namespace libtorrent;
|
using namespace libtorrent;
|
||||||
@@ -40,10 +40,10 @@ class consoleDlg : public QDialog, private Ui_ConsoleDlg{
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Bittorrent *BTSession;
|
QBtSession *BTSession;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
consoleDlg(QWidget *parent, Bittorrent* _BTSession) : QDialog(parent) {
|
consoleDlg(QWidget *parent, QBtSession* _BTSession) : QDialog(parent) {
|
||||||
setupUi(this);
|
setupUi(this);
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
setModal(true);
|
setModal(true);
|
||||||
|
|||||||
221
src/feedList.h
221
src/feedList.h
@@ -1,221 +0,0 @@
|
|||||||
#ifndef FEEDLIST_H
|
|
||||||
#define FEEDLIST_H
|
|
||||||
|
|
||||||
#include <QTreeWidget>
|
|
||||||
#include <QTreeWidgetItem>
|
|
||||||
#include <QDropEvent>
|
|
||||||
#include <QDragMoveEvent>
|
|
||||||
#include <QStringList>
|
|
||||||
#include <QHash>
|
|
||||||
#include <QUrl>
|
|
||||||
#include "rss.h"
|
|
||||||
|
|
||||||
class FeedList: public QTreeWidget {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
private:
|
|
||||||
RssManager *rssmanager;
|
|
||||||
QHash<QTreeWidgetItem*, RssFile*> mapping;
|
|
||||||
QHash<QString, QTreeWidgetItem*> feeds_items;
|
|
||||||
QTreeWidgetItem* current_feed;
|
|
||||||
QTreeWidgetItem *unread_item;
|
|
||||||
|
|
||||||
public:
|
|
||||||
FeedList(QWidget *parent, RssManager *rssmanager): QTreeWidget(parent), rssmanager(rssmanager) {
|
|
||||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
|
||||||
setDragDropMode(QAbstractItemView::InternalMove);
|
|
||||||
setSelectionMode(QAbstractItemView::ExtendedSelection);
|
|
||||||
setColumnCount(1);
|
|
||||||
QTreeWidgetItem *___qtreewidgetitem = headerItem();
|
|
||||||
___qtreewidgetitem->setText(0, QApplication::translate("RSS", "RSS feeds", 0, QApplication::UnicodeUTF8));
|
|
||||||
unread_item = new QTreeWidgetItem(this);
|
|
||||||
unread_item->setText(0, tr("Unread") + QString::fromUtf8(" (") + QString::number(rssmanager->getNbUnRead(), 10)+ QString(")"));
|
|
||||||
unread_item->setData(0,Qt::DecorationRole, QVariant(QIcon(":/Icons/oxygen/mail-folder-inbox.png")));
|
|
||||||
itemAdded(unread_item, rssmanager);
|
|
||||||
connect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(updateCurrentFeed(QTreeWidgetItem*)));
|
|
||||||
setCurrentItem(unread_item);
|
|
||||||
}
|
|
||||||
|
|
||||||
~FeedList() {
|
|
||||||
disconnect(this, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), this, SLOT(updateCurrentFeed(QTreeWidgetItem*)));
|
|
||||||
delete unread_item;
|
|
||||||
}
|
|
||||||
|
|
||||||
void itemAdded(QTreeWidgetItem *item, RssFile* file) {
|
|
||||||
mapping[item] = file;
|
|
||||||
if(file->getType() == RssFile::STREAM) {
|
|
||||||
feeds_items[file->getID()] = item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void itemAboutToBeRemoved(QTreeWidgetItem *item) {
|
|
||||||
RssFile* file = mapping.take(item);
|
|
||||||
if(file->getType() == RssFile::STREAM) {
|
|
||||||
feeds_items.remove(file->getID());
|
|
||||||
} else {
|
|
||||||
QList<RssStream*> feeds = ((RssFolder*)file)->getAllFeeds();
|
|
||||||
foreach(RssStream* feed, feeds) {
|
|
||||||
feeds_items.remove(feed->getID());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasFeed(QString url) const {
|
|
||||||
return feeds_items.contains(QUrl(url).toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QTreeWidgetItem*> getAllFeedItems() const {
|
|
||||||
return feeds_items.values();
|
|
||||||
}
|
|
||||||
|
|
||||||
QTreeWidgetItem* getUnreadItem() const {
|
|
||||||
return unread_item;
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList getItemPath(QTreeWidgetItem* item) const {
|
|
||||||
QStringList path;
|
|
||||||
if(item) {
|
|
||||||
if(item->parent())
|
|
||||||
path << getItemPath(item->parent());
|
|
||||||
path.append(getRSSItem(item)->getID());
|
|
||||||
}
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QTreeWidgetItem*> getAllOpenFolders(QTreeWidgetItem *parent=0) const {
|
|
||||||
QList<QTreeWidgetItem*> open_folders;
|
|
||||||
int nbChildren;
|
|
||||||
if(parent)
|
|
||||||
nbChildren = parent->childCount();
|
|
||||||
else
|
|
||||||
nbChildren = topLevelItemCount();
|
|
||||||
for(int i=0; i<nbChildren; ++i) {
|
|
||||||
QTreeWidgetItem *item;
|
|
||||||
if(parent)
|
|
||||||
item = parent->child(i);
|
|
||||||
else
|
|
||||||
item = topLevelItem(i);
|
|
||||||
if(getItemType(item) == RssFile::FOLDER && item->isExpanded()) {
|
|
||||||
QList<QTreeWidgetItem*> open_subfolders = getAllOpenFolders(item);
|
|
||||||
if(!open_subfolders.empty()) {
|
|
||||||
open_folders << open_subfolders;
|
|
||||||
} else {
|
|
||||||
open_folders << item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return open_folders;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QTreeWidgetItem*> getAllFeedItems(QTreeWidgetItem* folder) {
|
|
||||||
QList<QTreeWidgetItem*> feeds;
|
|
||||||
int nbChildren = folder->childCount();
|
|
||||||
for(int i=0; i<nbChildren; ++i) {
|
|
||||||
QTreeWidgetItem *item = folder->child(i);
|
|
||||||
if(getItemType(item) == RssFile::STREAM) {
|
|
||||||
feeds << item;
|
|
||||||
} else {
|
|
||||||
feeds << getAllFeedItems(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return feeds;
|
|
||||||
}
|
|
||||||
|
|
||||||
RssFile* getRSSItem(QTreeWidgetItem *item) const {
|
|
||||||
return mapping.value(item, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
RssFile::FileType getItemType(QTreeWidgetItem *item) const {
|
|
||||||
return mapping.value(item)->getType();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString getItemID(QTreeWidgetItem *item) const {
|
|
||||||
return mapping.value(item)->getID();
|
|
||||||
}
|
|
||||||
|
|
||||||
QTreeWidgetItem* getTreeItemFromUrl(QString url) const{
|
|
||||||
return feeds_items.value(url, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
RssStream* getRSSItemFromUrl(QString url) const {
|
|
||||||
return (RssStream*)getRSSItem(getTreeItemFromUrl(url));
|
|
||||||
}
|
|
||||||
|
|
||||||
QTreeWidgetItem* currentItem() const {
|
|
||||||
return current_feed;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTreeWidgetItem* currentFeed() const {
|
|
||||||
return current_feed;
|
|
||||||
}
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void foldersAltered(QList<QTreeWidgetItem*> folders);
|
|
||||||
void overwriteAttempt(QString filename);
|
|
||||||
|
|
||||||
protected slots:
|
|
||||||
void updateCurrentFeed(QTreeWidgetItem* new_item) {
|
|
||||||
if(!new_item) return;
|
|
||||||
if(!mapping.contains(new_item)) return;
|
|
||||||
if((getItemType(new_item) == RssFile::STREAM) || new_item == unread_item)
|
|
||||||
current_feed = new_item;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void dragMoveEvent(QDragMoveEvent * event) {
|
|
||||||
QTreeWidgetItem *item = itemAt(event->pos());
|
|
||||||
if(item == unread_item) {
|
|
||||||
event->ignore();
|
|
||||||
} else {
|
|
||||||
if(item && getItemType(item) != RssFile::FOLDER)
|
|
||||||
event->ignore();
|
|
||||||
else {
|
|
||||||
if(selectedItems().contains(unread_item)) {
|
|
||||||
event->ignore();
|
|
||||||
} else {
|
|
||||||
QTreeWidget::dragMoveEvent(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void dropEvent(QDropEvent *event) {
|
|
||||||
qDebug("dropEvent");
|
|
||||||
QList<QTreeWidgetItem*> folders_altered;
|
|
||||||
QTreeWidgetItem *dest_folder_item = itemAt(event->pos());
|
|
||||||
RssFolder *dest_folder;
|
|
||||||
if(dest_folder_item) {
|
|
||||||
dest_folder = (RssFolder*)getRSSItem(dest_folder_item);
|
|
||||||
folders_altered << dest_folder_item;
|
|
||||||
} else {
|
|
||||||
dest_folder = rssmanager;
|
|
||||||
}
|
|
||||||
QList<QTreeWidgetItem *> src_items = selectedItems();
|
|
||||||
// Check if there is not going to overwrite another file
|
|
||||||
foreach(QTreeWidgetItem *src_item, src_items) {
|
|
||||||
RssFile *file = getRSSItem(src_item);
|
|
||||||
if(dest_folder->hasChild(file->getID())) {
|
|
||||||
emit overwriteAttempt(file->getID());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Proceed with the move
|
|
||||||
foreach(QTreeWidgetItem *src_item, src_items) {
|
|
||||||
QTreeWidgetItem *parent_folder = src_item->parent();
|
|
||||||
if(parent_folder && !folders_altered.contains(parent_folder))
|
|
||||||
folders_altered << parent_folder;
|
|
||||||
// Actually move the file
|
|
||||||
RssFile *file = getRSSItem(src_item);
|
|
||||||
rssmanager->moveFile(file, dest_folder);
|
|
||||||
}
|
|
||||||
QTreeWidget::dropEvent(event);
|
|
||||||
if(dest_folder_item)
|
|
||||||
dest_folder_item->setExpanded(true);
|
|
||||||
// Emit signal for update
|
|
||||||
if(!folders_altered.empty())
|
|
||||||
emit foldersAltered(folders_altered);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // FEEDLIST_H
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -34,7 +34,7 @@
|
|||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include "preferences.h"
|
#include "preferences.h"
|
||||||
#include "bittorrent.h"
|
#include "qbtsession.h"
|
||||||
|
|
||||||
class HeadlessLoader: public QObject {
|
class HeadlessLoader: public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -44,7 +44,7 @@ public:
|
|||||||
// Enable Web UI
|
// Enable Web UI
|
||||||
Preferences::setWebUiEnabled(true);
|
Preferences::setWebUiEnabled(true);
|
||||||
// Instanciate Bittorrent Object
|
// Instanciate Bittorrent Object
|
||||||
BTSession = new Bittorrent();
|
BTSession = new QBtSession();
|
||||||
connect(BTSession, SIGNAL(newConsoleMessage(QString)), this, SLOT(displayConsoleMessage(QString)));
|
connect(BTSession, SIGNAL(newConsoleMessage(QString)), this, SLOT(displayConsoleMessage(QString)));
|
||||||
// Resume unfinished torrents
|
// Resume unfinished torrents
|
||||||
BTSession->startUpTorrents();
|
BTSession->startUpTorrents();
|
||||||
@@ -103,7 +103,7 @@ public slots:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Bittorrent *BTSession;
|
QBtSession *BTSession;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user