mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-12-21 07:57:22 -06:00
Compare commits
5 Commits
release-3.
...
release-3.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9c50ea14cb | ||
|
|
42a74ea78e | ||
|
|
1ac68a9192 | ||
|
|
29b5d460ea | ||
|
|
a441bca4de |
@@ -1,3 +1,8 @@
|
|||||||
|
* Thu Jan 21 2016 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.3.3
|
||||||
|
- BUGFIX: Temporarily disable "filename" column of peers view. It has a bug that causes frequent crashes. See issue #4597.
|
||||||
|
- WEBUI: Move style of dynamic table header to CSS (buinsky)
|
||||||
|
- WEBUI: Fix unnecessary updates of torrent peers table (buinsky)
|
||||||
|
|
||||||
* Tue Jan 19 2016 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.3.2
|
* Tue Jan 19 2016 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.3.2
|
||||||
- FEATURE: Add a new column to peers list that shows list of files which are downloaded right now from a peer. (evsh)
|
- FEATURE: Add a new column to peers list that shows list of files which are downloaded right now from a peer. (evsh)
|
||||||
- FEATURE: Improve the "Watch folders" UI. Closes #4300. You'll need to redo your watch folders settings. (sledgehammer999, glassez)
|
- FEATURE: Improve the "Watch folders" UI. Closes #4300. You'll need to redo your watch folders settings. (sledgehammer999, glassez)
|
||||||
|
|||||||
2
dist/mac/Info.plist
vendored
2
dist/mac/Info.plist
vendored
@@ -45,7 +45,7 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>3.3.2</string>
|
<string>3.3.3</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>qBit</string>
|
<string>qBit</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
|
|||||||
2
dist/windows/options.nsi
vendored
2
dist/windows/options.nsi
vendored
@@ -19,7 +19,7 @@ XPStyle on
|
|||||||
!define CSIDL_APPDATA '0x1A' ;Application Data path
|
!define CSIDL_APPDATA '0x1A' ;Application Data path
|
||||||
!define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path
|
!define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path
|
||||||
|
|
||||||
!define PROG_VERSION "3.3.2"
|
!define PROG_VERSION "3.3.3"
|
||||||
!define MUI_FINISHPAGE_RUN
|
!define MUI_FINISHPAGE_RUN
|
||||||
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
|
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
|
||||||
!define MUI_FINISHPAGE_RUN_TEXT $(launch_qbt)
|
!define MUI_FINISHPAGE_RUN_TEXT $(launch_qbt)
|
||||||
|
|||||||
@@ -408,8 +408,3 @@ QString PeerInfo::flagsDescription() const
|
|||||||
{
|
{
|
||||||
return m_flagsDescription;
|
return m_flagsDescription;
|
||||||
}
|
}
|
||||||
|
|
||||||
int PeerInfo::downloadingPieceIndex() const
|
|
||||||
{
|
|
||||||
return m_nativeInfo.downloading_piece_index;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -100,7 +100,6 @@ namespace BitTorrent
|
|||||||
#ifndef DISABLE_COUNTRIES_RESOLUTION
|
#ifndef DISABLE_COUNTRIES_RESOLUTION
|
||||||
QString country() const;
|
QString country() const;
|
||||||
#endif
|
#endif
|
||||||
int downloadingPieceIndex() const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void calcRelevance(const TorrentHandle *torrent);
|
void calcRelevance(const TorrentHandle *torrent);
|
||||||
|
|||||||
@@ -211,20 +211,6 @@ QByteArray TorrentInfo::metadata() const
|
|||||||
return QByteArray(m_nativeInfo->metadata().get(), m_nativeInfo->metadata_size());
|
return QByteArray(m_nativeInfo->metadata().get(), m_nativeInfo->metadata_size());
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList TorrentInfo::filesForPiece(int pieceIndex) const
|
|
||||||
{
|
|
||||||
if (pieceIndex < 0)
|
|
||||||
return QStringList();
|
|
||||||
|
|
||||||
std::vector<libtorrent::file_slice> files(
|
|
||||||
nativeInfo()->map_block(pieceIndex, 0, nativeInfo()->piece_length()));
|
|
||||||
QStringList res;
|
|
||||||
for (const libtorrent::file_slice& s: files) {
|
|
||||||
res.append(filePath(s.file_index));
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
void TorrentInfo::renameFile(uint index, const QString &newPath)
|
void TorrentInfo::renameFile(uint index, const QString &newPath)
|
||||||
{
|
{
|
||||||
if (!isValid()) return;
|
if (!isValid()) return;
|
||||||
|
|||||||
@@ -75,7 +75,6 @@ namespace BitTorrent
|
|||||||
QList<TrackerEntry> trackers() const;
|
QList<TrackerEntry> trackers() const;
|
||||||
QList<QUrl> urlSeeds() const;
|
QList<QUrl> urlSeeds() const;
|
||||||
QByteArray metadata() const;
|
QByteArray metadata() const;
|
||||||
QStringList filesForPiece(int pieceIndex) const;
|
|
||||||
|
|
||||||
void renameFile(uint index, const QString &newPath);
|
void renameFile(uint index, const QString &newPath);
|
||||||
boost::intrusive_ptr<libtorrent::torrent_info> nativeInfo() const;
|
boost::intrusive_ptr<libtorrent::torrent_info> nativeInfo() const;
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class PeerListDelegate: public QItemDelegate {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
enum PeerListColumns {COUNTRY, IP, PORT, CONNECTION, FLAGS, CLIENT, PROGRESS, DOWN_SPEED, UP_SPEED,
|
enum PeerListColumns {COUNTRY, IP, PORT, CONNECTION, FLAGS, CLIENT, PROGRESS, DOWN_SPEED, UP_SPEED,
|
||||||
TOT_DOWN, TOT_UP, RELEVANCE, DOWNLOADING_PIECE, IP_HIDDEN, COL_COUNT};
|
TOT_DOWN, TOT_UP, RELEVANCE, IP_HIDDEN, COL_COUNT};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PeerListDelegate(QObject *parent) : QItemDelegate(parent) {}
|
PeerListDelegate(QObject *parent) : QItemDelegate(parent) {}
|
||||||
|
|||||||
@@ -78,7 +78,6 @@ PeerListWidget::PeerListWidget(PropertiesWidget *parent)
|
|||||||
m_listModel->setHeaderData(PeerListDelegate::TOT_DOWN, Qt::Horizontal, tr("Downloaded", "i.e: total data downloaded"));
|
m_listModel->setHeaderData(PeerListDelegate::TOT_DOWN, Qt::Horizontal, tr("Downloaded", "i.e: total data downloaded"));
|
||||||
m_listModel->setHeaderData(PeerListDelegate::TOT_UP, Qt::Horizontal, tr("Uploaded", "i.e: total data uploaded"));
|
m_listModel->setHeaderData(PeerListDelegate::TOT_UP, Qt::Horizontal, tr("Uploaded", "i.e: total data uploaded"));
|
||||||
m_listModel->setHeaderData(PeerListDelegate::RELEVANCE, Qt::Horizontal, tr("Relevance", "i.e: How relevant this peer is to us. How many pieces it has that we don't."));
|
m_listModel->setHeaderData(PeerListDelegate::RELEVANCE, Qt::Horizontal, tr("Relevance", "i.e: How relevant this peer is to us. How many pieces it has that we don't."));
|
||||||
m_listModel->setHeaderData(PeerListDelegate::DOWNLOADING_PIECE, Qt::Horizontal, tr("Files", "i.e. files that are being downloaded right now"));
|
|
||||||
// Proxy model to support sorting without actually altering the underlying model
|
// Proxy model to support sorting without actually altering the underlying model
|
||||||
m_proxyModel = new PeerListSortModel();
|
m_proxyModel = new PeerListSortModel();
|
||||||
m_proxyModel->setDynamicSortFilter(true);
|
m_proxyModel->setDynamicSortFilter(true);
|
||||||
@@ -283,14 +282,14 @@ void PeerListWidget::loadPeers(BitTorrent::TorrentHandle *const torrent, bool fo
|
|||||||
QString peerIp = addr.ip.toString();
|
QString peerIp = addr.ip.toString();
|
||||||
if (m_peerItems.contains(peerIp)) {
|
if (m_peerItems.contains(peerIp)) {
|
||||||
// Update existing peer
|
// Update existing peer
|
||||||
updatePeer(peerIp, torrent, peer);
|
updatePeer(peerIp, peer);
|
||||||
oldeersSet.remove(peerIp);
|
oldeersSet.remove(peerIp);
|
||||||
if (forceHostnameResolution && m_resolver)
|
if (forceHostnameResolution && m_resolver)
|
||||||
m_resolver->resolve(peerIp);
|
m_resolver->resolve(peerIp);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Add new peer
|
// Add new peer
|
||||||
m_peerItems[peerIp] = addPeer(peerIp, torrent, peer);
|
m_peerItems[peerIp] = addPeer(peerIp, peer);
|
||||||
m_peerAddresses[peerIp] = addr;
|
m_peerAddresses[peerIp] = addr;
|
||||||
// Resolve peer host name is asked
|
// Resolve peer host name is asked
|
||||||
if (m_resolver)
|
if (m_resolver)
|
||||||
@@ -308,7 +307,7 @@ void PeerListWidget::loadPeers(BitTorrent::TorrentHandle *const torrent, bool fo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QStandardItem* PeerListWidget::addPeer(const QString& ip, BitTorrent::TorrentHandle *const torrent, const BitTorrent::PeerInfo &peer)
|
QStandardItem* PeerListWidget::addPeer(const QString &ip, const BitTorrent::PeerInfo &peer)
|
||||||
{
|
{
|
||||||
int row = m_listModel->rowCount();
|
int row = m_listModel->rowCount();
|
||||||
// Adding Peer to peer list
|
// Adding Peer to peer list
|
||||||
@@ -338,14 +337,10 @@ QStandardItem* PeerListWidget::addPeer(const QString& ip, BitTorrent::TorrentHan
|
|||||||
m_listModel->setData(m_listModel->index(row, PeerListDelegate::TOT_DOWN), peer.totalDownload());
|
m_listModel->setData(m_listModel->index(row, PeerListDelegate::TOT_DOWN), peer.totalDownload());
|
||||||
m_listModel->setData(m_listModel->index(row, PeerListDelegate::TOT_UP), peer.totalUpload());
|
m_listModel->setData(m_listModel->index(row, PeerListDelegate::TOT_UP), peer.totalUpload());
|
||||||
m_listModel->setData(m_listModel->index(row, PeerListDelegate::RELEVANCE), peer.relevance());
|
m_listModel->setData(m_listModel->index(row, PeerListDelegate::RELEVANCE), peer.relevance());
|
||||||
QStringList downloadingFiles(torrent->info().filesForPiece(peer.downloadingPieceIndex()));
|
|
||||||
m_listModel->setData(m_listModel->index(row, PeerListDelegate::DOWNLOADING_PIECE), downloadingFiles.join(QLatin1String(";")));
|
|
||||||
m_listModel->setData(m_listModel->index(row, PeerListDelegate::DOWNLOADING_PIECE), downloadingFiles.join(QLatin1String("\n")), Qt::ToolTipRole);
|
|
||||||
|
|
||||||
return m_listModel->item(row, PeerListDelegate::IP);
|
return m_listModel->item(row, PeerListDelegate::IP);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PeerListWidget::updatePeer(const QString &ip, BitTorrent::TorrentHandle *const torrent, const BitTorrent::PeerInfo &peer)
|
void PeerListWidget::updatePeer(const QString &ip, const BitTorrent::PeerInfo &peer)
|
||||||
{
|
{
|
||||||
QStandardItem *item = m_peerItems.value(ip);
|
QStandardItem *item = m_peerItems.value(ip);
|
||||||
int row = item->row();
|
int row = item->row();
|
||||||
@@ -369,9 +364,6 @@ void PeerListWidget::updatePeer(const QString &ip, BitTorrent::TorrentHandle *co
|
|||||||
m_listModel->setData(m_listModel->index(row, PeerListDelegate::TOT_DOWN), peer.totalDownload());
|
m_listModel->setData(m_listModel->index(row, PeerListDelegate::TOT_DOWN), peer.totalDownload());
|
||||||
m_listModel->setData(m_listModel->index(row, PeerListDelegate::TOT_UP), peer.totalUpload());
|
m_listModel->setData(m_listModel->index(row, PeerListDelegate::TOT_UP), peer.totalUpload());
|
||||||
m_listModel->setData(m_listModel->index(row, PeerListDelegate::RELEVANCE), peer.relevance());
|
m_listModel->setData(m_listModel->index(row, PeerListDelegate::RELEVANCE), peer.relevance());
|
||||||
QStringList downloadingFiles(torrent->info().filesForPiece(peer.downloadingPieceIndex()));
|
|
||||||
m_listModel->setData(m_listModel->index(row, PeerListDelegate::DOWNLOADING_PIECE), downloadingFiles.join(QLatin1String(";")));
|
|
||||||
m_listModel->setData(m_listModel->index(row, PeerListDelegate::DOWNLOADING_PIECE), downloadingFiles.join(QLatin1String("\n")), Qt::ToolTipRole);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PeerListWidget::handleResolved(const QString &ip, const QString &hostname)
|
void PeerListWidget::handleResolved(const QString &ip, const QString &hostname)
|
||||||
|
|||||||
@@ -68,8 +68,8 @@ public:
|
|||||||
~PeerListWidget();
|
~PeerListWidget();
|
||||||
|
|
||||||
void loadPeers(BitTorrent::TorrentHandle *const torrent, bool forceHostnameResolution = false);
|
void loadPeers(BitTorrent::TorrentHandle *const torrent, bool forceHostnameResolution = false);
|
||||||
QStandardItem *addPeer(const QString &ip, BitTorrent::TorrentHandle *const torrent, const BitTorrent::PeerInfo &peer);
|
QStandardItem *addPeer(const QString &ip, const BitTorrent::PeerInfo &peer);
|
||||||
void updatePeer(const QString &ip, BitTorrent::TorrentHandle *const torrent, const BitTorrent::PeerInfo &peer);
|
void updatePeer(const QString &ip, const BitTorrent::PeerInfo &peer);
|
||||||
void updatePeerHostNameResolutionState();
|
void updatePeerHostNameResolutionState();
|
||||||
void updatePeerCountryResolutionState();
|
void updatePeerCountryResolutionState();
|
||||||
void clear();
|
void clear();
|
||||||
|
|||||||
@@ -88,3 +88,7 @@
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
max-width: 300px;
|
max-width: 300px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tr.dynamicTableHeader {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@
|
|||||||
<div id="peers">
|
<div id="peers">
|
||||||
<table class="torrentTable" cellpadding="0" cellspacing="0" style="width: 100%">
|
<table class="torrentTable" cellpadding="0" cellspacing="0" style="width: 100%">
|
||||||
<thead>
|
<thead>
|
||||||
<tr id="torrentPeersTableHeader">
|
<tr id="torrentPeersTableHeader" class="dynamicTableHeader">
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody id="torrentPeersTable"></tbody>
|
<tbody id="torrentPeersTable"></tbody>
|
||||||
|
|||||||
@@ -212,8 +212,11 @@ var DynamicTable = new Class({
|
|||||||
if (tr.hasClass('selected'))
|
if (tr.hasClass('selected'))
|
||||||
tr.removeClass('selected');
|
tr.removeClass('selected');
|
||||||
}
|
}
|
||||||
|
this.onSelectedRowChanged();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onSelectedRowChanged : function () {},
|
||||||
|
|
||||||
updateRowData : function (data) {
|
updateRowData : function (data) {
|
||||||
var rowId = data['rowId'];
|
var rowId = data['rowId'];
|
||||||
var row;
|
var row;
|
||||||
@@ -350,7 +353,6 @@ var DynamicTable = new Class({
|
|||||||
} else {
|
} else {
|
||||||
// Simple selection
|
// Simple selection
|
||||||
this._this.selectRow(this.rowId);
|
this._this.selectRow(this.rowId);
|
||||||
updatePropertiesPanel();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -439,18 +441,18 @@ var TorrentsTable = new Class({
|
|||||||
Extends: DynamicTable,
|
Extends: DynamicTable,
|
||||||
|
|
||||||
initColumns : function () {
|
initColumns : function () {
|
||||||
this.newColumn('priority', 'width: 30px; cursor: pointer', '#');
|
this.newColumn('priority', 'width: 30px', '#');
|
||||||
this.newColumn('state_icon', 'width: 16px', '');
|
this.newColumn('state_icon', 'width: 16px; cursor: default', '');
|
||||||
this.newColumn('name', 'min-width: 200px; cursor: pointer', 'QBT_TR(Name)QBT_TR');
|
this.newColumn('name', 'min-width: 200px', 'QBT_TR(Name)QBT_TR');
|
||||||
this.newColumn('size', 'width: 100px; cursor: pointer', 'QBT_TR(Size)QBT_TR');
|
this.newColumn('size', 'width: 100px', 'QBT_TR(Size)QBT_TR');
|
||||||
this.newColumn('progress', 'width: 80px; cursor: pointer', 'QBT_TR(Done)QBT_TR');
|
this.newColumn('progress', 'width: 80px', 'QBT_TR(Done)QBT_TR');
|
||||||
this.newColumn('num_seeds', 'width: 100px; cursor: pointer', 'QBT_TR(Seeds)QBT_TR');
|
this.newColumn('num_seeds', 'width: 100px', 'QBT_TR(Seeds)QBT_TR');
|
||||||
this.newColumn('num_leechs', 'width: 100px; cursor: pointer', 'QBT_TR(Peers)QBT_TR');
|
this.newColumn('num_leechs', 'width: 100px', 'QBT_TR(Peers)QBT_TR');
|
||||||
this.newColumn('dlspeed', 'width: 100px; cursor: pointer', 'QBT_TR(Down Speed)QBT_TR');
|
this.newColumn('dlspeed', 'width: 100px', 'QBT_TR(Down Speed)QBT_TR');
|
||||||
this.newColumn('upspeed', 'width: 100px; cursor: pointer', 'QBT_TR(Up Speed)QBT_TR');
|
this.newColumn('upspeed', 'width: 100px', 'QBT_TR(Up Speed)QBT_TR');
|
||||||
this.newColumn('eta', 'width: 100px; cursor: pointer', 'QBT_TR(ETA)QBT_TR');
|
this.newColumn('eta', 'width: 100px', 'QBT_TR(ETA)QBT_TR');
|
||||||
this.newColumn('ratio', 'width: 100px; cursor: pointer', 'QBT_TR(Ratio)QBT_TR');
|
this.newColumn('ratio', 'width: 100px', 'QBT_TR(Ratio)QBT_TR');
|
||||||
this.newColumn('label', 'width: 100px; cursor: pointer', 'QBT_TR(Label)QBT_TR');
|
this.newColumn('label', 'width: 100px', 'QBT_TR(Label)QBT_TR');
|
||||||
|
|
||||||
this.columns['state_icon'].onclick = '';
|
this.columns['state_icon'].onclick = '';
|
||||||
this.columns['state_icon'].dataProperties[0] = 'state';
|
this.columns['state_icon'].dataProperties[0] = 'state';
|
||||||
@@ -720,6 +722,10 @@ var TorrentsTable = new Class({
|
|||||||
|
|
||||||
getCurrentTorrentHash : function () {
|
getCurrentTorrentHash : function () {
|
||||||
return this.getSelectedRowId();
|
return this.getSelectedRowId();
|
||||||
|
},
|
||||||
|
|
||||||
|
onSelectedRowChanged : function () {
|
||||||
|
updatePropertiesPanel();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<table class="torrentTable" cellpadding="0" cellspacing="0">
|
<table class="torrentTable" cellpadding="0" cellspacing="0">
|
||||||
<thead>
|
<thead>
|
||||||
<tr id="torrentsTableHeader">
|
<tr id="torrentsTableHeader" class="dynamicTableHeader">
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody id="torrentsTable"></tbody>
|
<tbody id="torrentsTable"></tbody>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ PROJECT_NAME = qbittorrent
|
|||||||
# Define version numbers here
|
# Define version numbers here
|
||||||
VER_MAJOR = 3
|
VER_MAJOR = 3
|
||||||
VER_MINOR = 3
|
VER_MINOR = 3
|
||||||
VER_BUGFIX = 2
|
VER_BUGFIX = 3
|
||||||
VER_BUILD = 0
|
VER_BUILD = 0
|
||||||
VER_STATUS = # Should be empty for stable releases!
|
VER_STATUS = # Should be empty for stable releases!
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user