You've already forked qBittorrent
mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-10-07 09:52:18 +02:00
Compare commits
36 Commits
v4_4_x
...
release-3.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
f836c40fc4 | ||
![]() |
21fe7f2ca6 | ||
![]() |
da85a57f83 | ||
![]() |
e35664b188 | ||
![]() |
2fc350b265 | ||
![]() |
83bcd6a2d7 | ||
![]() |
edcfa4df12 | ||
![]() |
12a83e1aec | ||
![]() |
7d50a8b28c | ||
![]() |
232e112d84 | ||
![]() |
5b1ee883b4 | ||
![]() |
b07fceec65 | ||
![]() |
4c9cf6c773 | ||
![]() |
164f37e961 | ||
![]() |
093fb303f3 | ||
![]() |
f3d5039e33 | ||
![]() |
007c307388 | ||
![]() |
4079689f32 | ||
![]() |
2b3d6926c8 | ||
![]() |
14b3414e9d | ||
![]() |
73254962f1 | ||
![]() |
74f042516b | ||
![]() |
8c0853248c | ||
![]() |
80ea0a67b5 | ||
![]() |
6d2b51203c | ||
![]() |
8ac82156b3 | ||
![]() |
c1806b099a | ||
![]() |
1046c816bf | ||
![]() |
cfbb5ecde5 | ||
![]() |
afdec02674 | ||
![]() |
927e6bc6cc | ||
![]() |
e862d3332c | ||
![]() |
699144a83d | ||
![]() |
1792f44bfa | ||
![]() |
64e4095ef1 | ||
![]() |
1d1ffcec7c |
16
Changelog
16
Changelog
@@ -1,3 +1,19 @@
|
||||
* Sat Sep 1 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.2
|
||||
- FEATURE: Add "clear" functionality to search field (closes #59)
|
||||
- BUGFIX: Attempt to use qBittorrent icon from theme if available (closes #49)
|
||||
- BUGFIX: Fix crash when a fastresume file is empty (closes #52)
|
||||
- BUGFIX: Fix encoding problem for detected XDG Download folder (closes #53)
|
||||
- BUGFIX: Improve performance when showing torrent content panel (Improves #24)
|
||||
- BUGFIX: Fix label-based filtering of torrents whose label contains special characters
|
||||
- BUGFIX: Fix possible crash due to labels (closes #64)
|
||||
|
||||
* Tue Aug 21 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.1
|
||||
- BUGFIX: Fix possible crash when adding a tracker to a magnet torrent without metadata (Closes #1034254)
|
||||
- BUGFIX: Remember queue position for torrents without metadata (closes #17)
|
||||
- BUGFIX: Fix crash when using unauthorized characters in label names (closes #19)
|
||||
- BUGFIX: Fix search plugins updating (closes #25)
|
||||
- BUGFIX: Make uTP connections rate limited by default
|
||||
|
||||
* Thu Aug 09 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.0
|
||||
- FEATURE: Brand new torrent addition dialog
|
||||
- FEATURE: Add the ability to choose the save path when using magnet links (mutoso)
|
||||
|
@@ -45,7 +45,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.0.0</string>
|
||||
<string>3.0.2</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>qBit</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
|
@@ -66,9 +66,6 @@
|
||||
|
||||
using namespace libtorrent;
|
||||
|
||||
// EXT2/3/4 file systems support a maximum of 255 bytes for filenames.
|
||||
const int MAX_FILENAME_BYTES = 255;
|
||||
|
||||
/**
|
||||
* Converts a path to a string suitable for display.
|
||||
* This function makes sure the directory separator used is consistent
|
||||
@@ -204,54 +201,6 @@ qint64 fsutils::computePathSize(const QString& path)
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fixes the given file path by shortening the file names if too long.
|
||||
*/
|
||||
QString fsutils::fixFileNames(const QString& path)
|
||||
{
|
||||
QByteArray raw_path = path.toLocal8Bit();
|
||||
raw_path.replace("\\", "/");
|
||||
QList<QByteArray> parts = raw_path.split('/');
|
||||
if (parts.isEmpty()) return path;
|
||||
QByteArray last_part = parts.takeLast();
|
||||
|
||||
QList<QByteArray>::iterator it = parts.begin();
|
||||
QList<QByteArray>::iterator itend = parts.end();
|
||||
for ( ; it != itend; ++it) {
|
||||
// Make sure the filename is not too long
|
||||
if (it->size() > MAX_FILENAME_BYTES) {
|
||||
qWarning() << "Folder" << *it << "was cut because it was too long";
|
||||
it->resize(MAX_FILENAME_BYTES);
|
||||
qWarning() << "New folder name is" << *it;
|
||||
Q_ASSERT(it->length() == MAX_FILENAME_BYTES);
|
||||
}
|
||||
}
|
||||
// Fix the last part (file name)
|
||||
qDebug() << "Last part length:" << last_part.length();
|
||||
if (last_part.length() > MAX_FILENAME_BYTES) {
|
||||
qWarning() << "Filename" << last_part << "was cut because it was too long";
|
||||
// Shorten the name, keep the file extension
|
||||
const int point_index = last_part.lastIndexOf(".");
|
||||
QByteArray extension = "";
|
||||
if (point_index >= 0) {
|
||||
extension = last_part.mid(point_index);
|
||||
last_part = last_part.left(point_index);
|
||||
}
|
||||
last_part.resize(MAX_FILENAME_BYTES - extension.length());
|
||||
last_part += extension;
|
||||
Q_ASSERT(last_part.length() == MAX_FILENAME_BYTES);
|
||||
qWarning() << "New file name is" << last_part;
|
||||
}
|
||||
|
||||
QString ret;
|
||||
foreach(const QByteArray& part, parts) {
|
||||
ret += QString::fromLocal8Bit(part.constData()) + "/";
|
||||
}
|
||||
ret += QString::fromLocal8Bit(last_part.constData());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes deep comparison of two files to make sure they are identical.
|
||||
*/
|
||||
@@ -496,6 +445,9 @@ QString fsutils::QDesktopServicesDownloadLocation() {
|
||||
QString user_dirs_file = config_path + "/user-dirs.dirs";
|
||||
if (QFile::exists(user_dirs_file)) {
|
||||
QSettings settings(user_dirs_file, QSettings::IniFormat);
|
||||
// We need to force UTF-8 encoding here since this is not
|
||||
// the default for Ini files.
|
||||
settings.setIniCodec("UTF-8");
|
||||
QString xdg_download_dir = settings.value("XDG_DOWNLOAD_DIR").toString();
|
||||
if (!xdg_download_dir.isEmpty()) {
|
||||
// Resolve $HOME environment variables
|
||||
|
@@ -46,7 +46,6 @@ static QString toDisplayPath(const QString& path);
|
||||
static QString fileExtension(const QString& filename);
|
||||
static QString fileName(const QString& file_path);
|
||||
static qint64 computePathSize(const QString& path);
|
||||
static QString fixFileNames(const QString& path);
|
||||
static bool sameFiles(const QString& path1, const QString& path2);
|
||||
static QString updateLabelInSavePath(QString defaultSavePath, QString save_path, const QString& old_label, const QString& new_label);
|
||||
static QString toValidFileSystemName(QString filename);
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -105,7 +105,13 @@ MainWindow::MainWindow(QWidget *parent, const QStringList& torrentCmdLine) : QMa
|
||||
// Clean exit on log out
|
||||
connect(static_cast<SessionApplication*>(qApp), SIGNAL(sessionIsShuttingDown()), this, SLOT(deleteBTSession()));
|
||||
// Setting icons
|
||||
this->setWindowIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent32.png")));
|
||||
#if defined(Q_WS_X11)
|
||||
if (Preferences().useSystemIconTheme())
|
||||
setWindowIcon(QIcon::fromTheme("qbittorrent", QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent32.png"))));
|
||||
else
|
||||
#else
|
||||
setWindowIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent32.png")));
|
||||
#endif
|
||||
actionOpen->setIcon(IconProvider::instance()->getIcon("list-add"));
|
||||
actionDownload_from_URL->setIcon(IconProvider::instance()->getIcon("insert-link"));
|
||||
actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png")));
|
||||
@@ -706,7 +712,7 @@ void MainWindow::toggleVisibility(QSystemTrayIcon::ActivationReason e) {
|
||||
return;
|
||||
}
|
||||
// Make sure the window is not minimized
|
||||
setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
|
||||
setWindowState(windowState() & (~Qt::WindowMinimized | Qt::WindowActive));
|
||||
// Then show it
|
||||
show();
|
||||
raise();
|
||||
@@ -1399,8 +1405,15 @@ QIcon MainWindow::getSystrayIcon() const
|
||||
}
|
||||
#endif
|
||||
QIcon icon;
|
||||
icon.addFile(":/Icons/skin/qbittorrent22.png", QSize(22, 22));
|
||||
icon.addFile(":/Icons/skin/qbittorrent16.png", QSize(16, 16));
|
||||
icon.addFile(":/Icons/skin/qbittorrent32.png", QSize(32, 32));
|
||||
#if defined(Q_WS_X11)
|
||||
if (Preferences().useSystemIconTheme()) {
|
||||
icon = QIcon::fromTheme("qbittorrent");
|
||||
}
|
||||
#endif
|
||||
if (icon.isNull()) {
|
||||
icon.addFile(":/Icons/skin/qbittorrent22.png", QSize(22, 22));
|
||||
icon.addFile(":/Icons/skin/qbittorrent16.png", QSize(16, 16));
|
||||
icon.addFile(":/Icons/skin/qbittorrent32.png", QSize(32, 32));
|
||||
}
|
||||
return icon;
|
||||
}
|
||||
|
@@ -509,7 +509,7 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>482</width>
|
||||
<width>486</width>
|
||||
<height>952</height>
|
||||
</rect>
|
||||
</property>
|
||||
@@ -969,7 +969,7 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>474</width>
|
||||
<width>486</width>
|
||||
<height>577</height>
|
||||
</rect>
|
||||
</property>
|
||||
@@ -1413,7 +1413,7 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>363</width>
|
||||
<width>486</width>
|
||||
<height>480</height>
|
||||
</rect>
|
||||
</property>
|
||||
@@ -1987,7 +1987,7 @@
|
||||
<item>
|
||||
<widget class="QLabel" name="label_anonymous">
|
||||
<property name="text">
|
||||
<string> (<a href="http://sourceforge.net/apps/mediawiki/qbittorrent/index.php?title=Anonymous_mode">More information</a>)</string>
|
||||
<string> (<a href="http://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode">More information</a>)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@@ -559,11 +559,11 @@ public:
|
||||
}
|
||||
|
||||
bool isuTPRateLimited() const {
|
||||
return value(QString::fromUtf8("Preferences/Bittorrent/uTP_rate_limiting"), false).toBool();
|
||||
return value(QString::fromUtf8("Preferences/Bittorrent/uTP_rate_limited"), true).toBool();
|
||||
}
|
||||
|
||||
void setuTPRateLimited(bool enabled) {
|
||||
setValue("Preferences/Bittorrent/uTP_rate_limiting", enabled);
|
||||
setValue("Preferences/Bittorrent/uTP_rate_limited", enabled);
|
||||
}
|
||||
|
||||
bool isDHTEnabled() const {
|
||||
|
@@ -234,13 +234,12 @@ void PropertiesWidget::updateTorrentInfos(const QTorrentHandle& _h) {
|
||||
}
|
||||
}
|
||||
|
||||
void PropertiesWidget::loadTorrentInfos(const QTorrentHandle &_h) {
|
||||
void PropertiesWidget::loadTorrentInfos(const QTorrentHandle& _h)
|
||||
{
|
||||
clear();
|
||||
h = _h;
|
||||
if (!h.is_valid()) {
|
||||
clear();
|
||||
if (!h.is_valid())
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// Save path
|
||||
@@ -260,10 +259,10 @@ void PropertiesWidget::loadTorrentInfos(const QTorrentHandle &_h) {
|
||||
// List files in torrent
|
||||
PropListModel->model()->setupModelData(h.get_torrent_info());
|
||||
filesList->setExpanded(PropListModel->index(0, 0), true);
|
||||
// Load file priorities
|
||||
PropListModel->model()->updateFilesPriorities(h.file_priorities());
|
||||
}
|
||||
} catch(invalid_handle& e) {
|
||||
|
||||
}
|
||||
} catch(const invalid_handle& e) { }
|
||||
// Load dynamic data
|
||||
loadDynamicData();
|
||||
}
|
||||
@@ -391,12 +390,17 @@ void PropertiesWidget::loadDynamicData() {
|
||||
filesList->setUpdatesEnabled(false);
|
||||
std::vector<size_type> fp;
|
||||
h.file_progress(fp);
|
||||
PropListModel->model()->updateFilesPriorities(h.file_priorities());
|
||||
PropListModel->model()->updateFilesProgress(fp);
|
||||
// XXX: We don't update file priorities regularly for performance
|
||||
// reasons. This means that priorities will not be updated if
|
||||
// set from the Web UI.
|
||||
// PropListModel->model()->updateFilesPriorities(h.file_priorities());
|
||||
filesList->setUpdatesEnabled(true);
|
||||
}
|
||||
}
|
||||
} catch(invalid_handle e) {}
|
||||
} catch(const invalid_handle& e) {
|
||||
qWarning() << "Caught exception in PropertiesWidget::loadDynamicData(): " << e.what();
|
||||
}
|
||||
}
|
||||
|
||||
void PropertiesWidget::loadUrlSeeds() {
|
||||
|
@@ -186,6 +186,28 @@ void TrackerList::clear() {
|
||||
}
|
||||
|
||||
void TrackerList::loadStickyItems(const QTorrentHandle &h) {
|
||||
// load DHT information
|
||||
if (QBtSession::instance()->isDHTEnabled() && (!h.has_metadata() || !h.priv())) {
|
||||
dht_item->setText(COL_STATUS, tr("Working"));
|
||||
} else {
|
||||
dht_item->setText(COL_STATUS, tr("Disabled"));
|
||||
}
|
||||
if (h.has_metadata() && h.priv()) {
|
||||
dht_item->setText(COL_MSG, tr("This torrent is private"));
|
||||
}
|
||||
|
||||
// Load PeX Information
|
||||
if (QBtSession::instance()->isPexEnabled())
|
||||
pex_item->setText(COL_STATUS, tr("Working"));
|
||||
else
|
||||
pex_item->setText(COL_STATUS, tr("Disabled"));
|
||||
|
||||
// Load LSD Information
|
||||
if (QBtSession::instance()->isLSDEnabled())
|
||||
lsd_item->setText(COL_STATUS, tr("Working"));
|
||||
else
|
||||
lsd_item->setText(COL_STATUS, tr("Disabled"));
|
||||
|
||||
// XXX: libtorrent should provide this info...
|
||||
// Count peers from DHT, LSD, PeX
|
||||
uint nb_dht = 0, nb_lsd = 0, nb_pex = 0;
|
||||
@@ -201,27 +223,8 @@ void TrackerList::loadStickyItems(const QTorrentHandle &h) {
|
||||
if (it->source & peer_info::pex)
|
||||
++nb_pex;
|
||||
}
|
||||
// load DHT information
|
||||
if (QBtSession::instance()->isDHTEnabled() && !h.priv()) {
|
||||
dht_item->setText(COL_STATUS, tr("Working"));
|
||||
} else {
|
||||
dht_item->setText(COL_STATUS, tr("Disabled"));
|
||||
}
|
||||
dht_item->setText(COL_PEERS, QString::number(nb_dht));
|
||||
if (h.has_metadata() && h.priv()) {
|
||||
dht_item->setText(COL_MSG, tr("This torrent is private"));
|
||||
}
|
||||
// Load PeX Information
|
||||
if (QBtSession::instance()->isPexEnabled())
|
||||
pex_item->setText(COL_STATUS, tr("Working"));
|
||||
else
|
||||
pex_item->setText(COL_STATUS, tr("Disabled"));
|
||||
pex_item->setText(COL_PEERS, QString::number(nb_pex));
|
||||
// Load LSD Information
|
||||
if (QBtSession::instance()->isLSDEnabled())
|
||||
lsd_item->setText(COL_STATUS, tr("Working"));
|
||||
else
|
||||
lsd_item->setText(COL_STATUS, tr("Disabled"));
|
||||
lsd_item->setText(COL_PEERS, QString::number(nb_lsd));
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user