Compare commits

..

5 Commits

Author SHA1 Message Date
sledgehammer999
9c50ea14cb Bump to 3.3.3 2016-01-21 00:49:39 +02:00
sledgehammer999
42a74ea78e Update Changelog. 2016-01-21 00:47:28 +02:00
sledgehammer999
1ac68a9192 Temporarily revert PR #2885 (filename column in peers view).
There's a bug that causes frequent crashes.
Issue #4597.
2016-01-21 00:44:14 +02:00
buinsky
29b5d460ea WebUI: Fix unnecessary updates of torrent peers table 2016-01-21 00:44:14 +02:00
buinsky
a441bca4de WebUI: Move style of dynamic table header to CSS 2016-01-21 00:44:14 +02:00
15 changed files with 40 additions and 54 deletions

View File

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

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

View File

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

View File

@@ -408,8 +408,3 @@ QString PeerInfo::flagsDescription() const
{ {
return m_flagsDescription; return m_flagsDescription;
} }
int PeerInfo::downloadingPieceIndex() const
{
return m_nativeInfo.downloading_piece_index;
}

View File

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

View File

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

View File

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

View File

@@ -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) {}

View File

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

View File

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

View File

@@ -88,3 +88,7 @@
white-space: nowrap; white-space: nowrap;
max-width: 300px; max-width: 300px;
} }
tr.dynamicTableHeader {
cursor: pointer;
}

View File

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

View File

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

View File

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

View File

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